如何防止SQL注入
什么是SQL注入?
SQL Injection 就是利用
某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入
侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的
过滤,导致非法数据库查询语句的执行 。
SQL注入的危害
SQL 注入(SQL Injection)攻击具有很大的危害,攻击者可以利用它读取、修改或者
删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以获得数据库管理
员的权限,而且,SQL Injection 也很难防范。网站管理员无法通过安装系统补丁或者进行简
单的安全配置进行自我保护,一般的防火墙也无法拦截 SQL Injection 攻击
防止SQL注入方法
1、对 Java、JSP 开发的应用,可以使用 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)