转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53769810
本文出自【DylanAndroid的博客】


JDBC如何有效防止SQL注入

在我们平时的开发中,作为新手写JDBC很有可能忽略了一点,那就是根本没有考虑SQL注入的问题,
那么,什么是SQL注入,以及如何防止SQL注入的问题。

一什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

二.先看一下数据表中的数据

1. 查询代码:
     /**数据库表名**/String tableName = "emp_test";/**先查看一下数据库当中的表数据**/DBUtil.query(tableName, null);
2. 查询结果:
SELECT  * FROM emp_test成功查询到了14行数据第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, PASSWORD=123456, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, PASSWORD=123456, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, PASSWORD=123456, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, PASSWORD=123456, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=amy}第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}

三.模拟登录,演示SQL注入

1. 模拟登录伪代码
            /**用户输入的用户名**/String name = "'1' OR '1'='1'";/**用户输入的密码**/String password = "'1' OR '1'='1'";/**我们拼SQL语句去查询**/String sql = "SELECT * FROM emp_test WHERE name = " + name + " and password = " + password;DBUtil.query(sql);```###### 2. 查询结果```javaSELECT * FROM emp_test WHERE name = '1' OR '1'='1' and password = '1' OR '1'='1'成功查询到了14行数据第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, PASSWORD=123456, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, PASSWORD=123456, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, PASSWORD=123456, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, PASSWORD=123456, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=amy}第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}

通过上面的操作我们发现,这根本就不是我们想要的结果,这样的话,随便一个人都能够登录成功了,那么如何去避免这种事情呢?

四.模拟登录,防止SQL注入

1. 模拟登录伪代码
     /**用户输入的用户名**/String name = "'1' OR '1'='1'";/**用户输入的密码**/String password = "'1' OR '1'='1'";/**我们用参数绑定去查询**/String where = "name = ?  AND password = ? ";String[] whereArgs = new String[]{name, password};DBUtil.query("emp_test", where, whereArgs);
2. 查询结果
  /**这条语句只是为了方便调试自己代印的语句,并不是PreparedStatement真正执行的SQL语句**/SELECT  * FROM emp_test WHERE name = '1' OR '1'='1'  AND password = '1' OR '1'='1'成功查询到了0行数据

通过参数绑定预编译的方案我们就可以有效的避免这种情况的发生。

五.GitHub

JDBC如何有效防止SQL注入相关推荐

  1. JDBC如何防止SQL注入

    JDBC如何有效防止SQL注入 在我们平时的开发中,作为新手写JDBC很有可能忽略了一点,那就是根本没有考虑SQL注入的问题, 那么,什么是SQL注入,以及如何防止SQL注入的问题. 1.什么是SQL ...

  2. 如何有效防止SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没 ...

  3. 2020-08-02 Mysql数据库索引初识、备份、设计原则、JDBC连接、SQL注入、PreparedStatement对象使用、事务处理、连接池

    ------------------------索引---------------------- 定义:帮助MYSQL高效获取数据的数据结构 ----------主键索引----------prima ...

  4. JDBC中的SQL注入

    1.JDBC中sql注入 1.1 JDBC JDBC的概念:JDBC是sun公司(已被Oracle收购)制定一系列接口标准,由不同数据库厂商(Oracle.MySQL等)实现接口方法并封装成驱动文件, ...

  5. 如何有效防止sql注入

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没 ...

  6. jdbc之防sql注入攻击

    1.SQL注入攻击:     由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而 ...

  7. 【JAVA高级】——吃透JDBC中的SQL注入问题和解决方案

    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进.

  8. java安全(二):JDBC|sql注入|预编译

    给个关注?宝儿! 给个关注?宝儿! 给个关注?宝儿! 关注公众号:b1gpig信息安全,文章推送不错过 1 JDBC基础 JDBC(Java Database Connectivity)是Java提供 ...

  9. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

最新文章

  1. 三维点云分割综述(中)
  2. Mysql一些重要配置参数的学习与整理(一)
  3. 京东王笑松:7FRESH是“无界零售”理论的业务践行
  4. Sayjoy┊多媒体在线编辑创作工具
  5. 湖南大学让晶体管小至3纳米,沟道长度仅一层原子 | Nature子刊
  6. Xiotech任命新CEO EMC又少一员大将
  7. 【sklearn学习】模型网格化调参
  8. okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
  9. 理解和使用SQL Server中的并行
  10. sql server经典sql
  11. about command : wget
  12. java工厂模式的学习
  13. Django03-视图系统views
  14. JS URL传中文参数引发的乱码问题
  15. python数字图像处理(9):直方图与均衡化
  16. springboot的学习笔记,这个很重要
  17. 推荐一款非常好用的文本替换工具“Replace Pioneer”
  18. OpenCV学习笔记05--ROI和WidthStep的运用
  19. 王树尧老师运筹学课程笔记 00 写在前面
  20. 供应脂质体形成材料DSPE-PEG-Thiol,DSPE-PEG-SH

热门文章

  1. Android设计一个app,穆易天气app设计尝试效果
  2. VS2015 更换序列号
  3. 百度大脑驾驶证识别使用攻略
  4. 为什么你不想学习?只想玩?人是如何一步一步废掉的
  5. 一文看懂25个神经网络模型,神经网络模型结构图
  6. Android 传感器介绍
  7. linux脚本基本命令大全,Shell脚本常用命令
  8. Java导出Excel和Word
  9. python中wheel什么意思_某个wheel(.whl)包的依赖关系是什么?
  10. JAVA超全笔试/面试考试题.(500问)--第三章面试题全面收录