如何防止SQL注入

什么是SQL注入?

 SQL Injection 就是利用
某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入
侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的
过滤,导致非法数据库查询语句的执行 。

SQL注入的危害

  SQL 注入(SQL Injection)攻击具有很大的危害,攻击者可以利用它读取、修改或者
删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以获得数据库管理
员的权限,而且,SQL Injection 也很难防范。网站管理员无法通过安装系统补丁或者进行简
单的安全配置进行自我保护,一般的防火墙也无法拦截 SQL Injection 攻击

防止SQL注入方法
  1、JavaJSP 开发的应用,可以使用 PrepareStatement+Bind-variable 来防止 SQL 注入

String sql = "select * from users u where u.id = ? and u.password = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,pwd);

resultset rs = ps.executequery();

  2、使用应用程序提供的转换函数

  很多应用程序接口都提供了对特殊字符进行转换的函数,恰当地使用这些函数,可以
防止应用程序用户输入使应用程序生成不期望的语句。
   MySQL C API:使用 mysql_real_escape_string() API 调用。
   MySQL++:使用 escape quote 修饰符。
   Perl DBI:使用 placeholders 或者 quote()方法。
  Ruby DBI:使用 placeholders 或者 quote()方法

  3、自己定义函数进行校验
  整理数据使之变得有效;
  拒绝已知的非法输入;
  只接受已知的合法输入。
  所以如果想要获得最好的安全状态,目前最好的解决办法就是对用户提交或者可能改
变的数据进行简单分类,分别应用正则表达式来对用户提供的输入数据进行严格的检测和验
证。
  下面采用正则表达式的方法提供一个验证函数,以供大家参考。
已知非法符号有:

“’”“;”“=”“(”“)”“/*”“*/”“%”“+”“”“>”“<”“--”“[”“]”
其实只需要过滤非法的符号组合就可以阻止已知形式的攻击,并且如果发现更新的攻
击符号组合,也可以将这些符号组合增添进来,继续防范新的攻击。特别是空格符号和与其
产生相同作用的分隔关键字的符号,例如“/**/”,如果能成功过滤这种符号,那么有很多
注入攻击将不能发生,并且同时也要过滤它们的十六进制表示“%XX”。
由此可以构造如下正则表达式:
(|\'|(\%27)|\;|(\%3b)|\=|(\%3d)|\(|(\%28)|\)|(\%29)|(\/*)|(\%2f%2a)|(\*/)|(\%2a%2f)|\+| (\
%2b)|\<|(\%3c)|\>|(\%3e)|\(--))|\[|\%5b|\]|\%5d)


posted @ 2018-09-16 10:54  极目天空  阅读(1680)  评论(0编辑  收藏  举报