对于上面提到的SQL 注入隐患,后果可想而知是很严重的,轻则获得数据信息,重则可以将数据进行非法更改。那么对这种情况有没有防范措施呢?
1、PrepareStatement+Bind-variable
对Java、JSP 开发的应用,可以使用PrepareStatement+Bind-variable 来防止SQL 注入,另
外从PHP 5 开始,也在扩展的MySQLI 中支持PrepareStatement,所以在使用这类语言作数
据库开发时,强烈建议使用PrepareStatement+Bind-variable 来实现,而尽量不要使用拼接的
SQL,下面以Java 为例说明一下实现方法:
…
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 修饰符。
PHP:使用mysql_real_escape_string()函数(适用于PHP 4.3.0 版本)。从PHP 5 开始,
可以使用扩展的MySQLI,这是对MySQL 新特性的一个扩展支持,其中的一个优点就是支持
PrepareStatement。
Perl DBI:使用placeholders 或者quote()方法。
Ruby DBI:使用placeholders 或者quote()方法。
3、自己定义函数进行校验
如果现有的转换函数仍然不能满足要求,则需要自己编写函数进行输入校验。输入验
证是一个很复杂的问题。输入验证的途径可以分为以下几种:
整理数据使之变得有效;
拒绝已知的非法输入;
只接受已知的合法输入。
所以如果想要获得最好的安全状态,目前最好的解决办法就是对用户提交或者可能改
变的数据进行简单分类,分别应用正则表达式来对用户提供的输入数据进行严格的检测和验
证。