Java Web 防范 SQL 注入攻击

1、SQL注入概述:

  SQL 注入是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,所以目前市面的防火墙都不会对 SQL 注入发出警报,如果管理员没查看日志的习惯,可能被入侵很长时间都不会发觉。
  其实 SQL 注入主要还是一些程序员的水平及经验参差不齐,没有对用户输入数据的合法性进行判断。 使应用程序存在安全隐患,任何用户可以提交一段数据库查询代码,并根据程序返回的结果,获得某些他想得知的数据,造成用户可以在输入中包含恶意代码篡改程序功能。更严重的用户还可能窃取最高管理权限,删除数据库中所有的数据。

2、SQL注入原理:

2.1 没有过滤,或没有正确过滤转义字符:

首先来看一个Sql语句:

String sql = "SELECT * FROM USERINFO WHERE NAME = '+" NAME "+'";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
Statement state =con.createStatement();
ResultSet resultSet = state.executeQuery(sql);

这里我们直接使用用户传递过来的 name 变量拼接了一条SQL 语句进行查询。 我们乐观地认为用户输入的都是正常的字符串,没有考虑到恶意攻击的情况。 但是如果用户输入了这样一段内容:String name = ” xxx’or’1’=’1”
那么 ,经过拼接得到的 SQL 就变成了这样。String sql = “SELECT * FROM USERINFO WHERE NAME = ‘xxx’or’1’=’1’”,将会查询得到所用的用户信息。

String name = ” xxx’or’1’=’1’;DROPTABLE USERINFO” 而sql语句如果变成这样,那么String sql = ”select * from USERINFO where name =’xxx’ or ‘1’ =’1’;DROPTABLE USERINFO “将会清掉整个表的记录。那么后果可想而知。

2.2、数据库服务器中的漏洞:
许多程序员认为, jsp 结合 mysql 是一个不错的选择,其主要原因是这两种技术都可以找到免费的载体。 但是有时,数据库服务器软件中也存在着漏洞 。 如 MYSQL 服务器中DATABASE () 、 USER () 、 SYSTEM_USER () 、 SESSION_US -ER ()、 CURRENT_USER () 等函数漏洞。 这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的 SQL 注入式攻击。

2.3、盲目 SQL 注入式攻击:
当一个 Web 应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目 SQL 注入式攻击。 有漏洞的网页会根据注入到合法语句中的逻辑语句的结果显示不同的内容。 这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。通过一次次的分析得到的这些结果获取想要的信息。

3 Java Web 下的解决方法:
3.1、利用 Javascript,在客户端进行校验:
通过以上分析我们看到,对于 SQL 注入其实就是利用一些特殊符号实现对数据库的操作。 所以可以利用 JavaScript 对输入的字符进行过滤。
例如:/select|update|delete|exec|count|’|” |=|;|>|<|%/i一些特殊字符和 SQL 关键字。

3.2、在后台,进行程序判定:
但是 JavaScript 有其自身的一些缺陷,因为它是运行在浏览器客户端的一种技术 。 当这个网页保存下来,进行修改页面以跳过这些过虑提交后, JavaScript 就失去作用了 。 所以最好在后台也对这些字符串进行处理 。有良好的编程习惯:

比如判断用户名和密码的时候不要只用:select * from user where username = ? and password =?,然后判断 select 出的结果为 size>0 。 这个方法容易被注入 。

应该用:select password from user where username = ? ,然后用select 出来的 password 和他提交上来的 password 对比一下是否一致 。 所以,如果要预防注入, 就必须要整体设计 、 养成良编程习惯。

3.3、使用 PreparedStatement 连接数据库:
为了解决这个问题,我们可以使用 PreparedStatement 。首先在创建 PreparedStatement 的时候会对sql 进行一次了处理,然后传递参数的时候,没有直接把参数拼接到sql里,采用占位符并且参数中有什么特殊字符, PreparedStatement 也会帮助自动转换 。总之,在使用PreparedStatement 执行查询的时候已经对sql进行了严格的处理,可以防止sql注入。

3.4、利用框架:
当今在 Java Web 领域,比较流行的是使用诸如 Spring、hibernate 等框架来防范风险 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值