什么是SQL注入?
SQL注入就是未将代码与数据进行严格的隔离,导致在读取用户数据的时候,错误地把黑客注入的数据作为代码的一部分执行。
SQL注入自诞生以来以其巨大的杀伤力闻名。
例子:
典型的SQL注入的例子是当对SQL语句进行字符串拼接操作时,直接使用未加转义的用户输入内容作为变量,比如:
var testCondition;
testCondition = Request.form("testCondition");
var sql = "select * from TableA where id ='" + testCondition +"'";
在上面的例子中,如果用户输入的ID只是一个ID字段是没有问题的,可以执行正常的查询语句。但如果使用“;”隔开,在testCondition里插入
其他SQL语句,则会带来意想不到的结果,比如drop、delete等。
曾经在某业务中,用户修改签名的时候,非常偶然地输入“#--!#(@这样的内容来表达心情,、单击保存后出发数据库更新。由于该业务未
对危险字符串“#--”进行转义,导致where后面的信息被注释掉,执行语句变成:
update tableB set nick =""#--!#(@“ where user_id=12345;
该SQL语句的执行导致全库的nick字段都被更新。所以,SQL注入的危害不必赘述,注入的原理也非常简单。
如何预防?
①过滤用户输入参数中的特殊字符,从而降低被SQL注入的风险。
②禁止通过字符串拼接的SQL语句,严格使用参数绑定传入的参数。
③合理使用数据库访问矿机提供的防注入机制。比如MyBatis提供的#{}绑定参数,从而防止SQL注入。同时谨慎使用${},${}相当于使用字符串拼接
SQL。拒绝拼接的SQL语句,使用参数化的语句。
总之,一定要建立对注入式攻击的风险意识,正确使用参数化绑定SQL变量,这样才能有效地避免SQL注入。实际上,其他的注入方式也是类似的
思路,身为一个开发工程师,我们一定要时刻保持对注入式攻击的高度警惕。