SQL注入问题

269 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天

SQL 注入是注入式攻击中的常见类型。

SQL 注入式攻击是未将代码与数据进行严格的隔离 ,导致在读取用户数据的时候 错误地把数据作为代码的一部分执行而导致一些安全问题。 SQL 注入自诞生以来以其巨大的杀伤力闻名。典型的 SQL注入的例子是当对 SQL 语旬进行字符串拼接操作时 直接使用未加转义的用户输入内容作为变量 ,比如

var testCondition ; 
testCondition = Request . from ("testCondition")
var sql = "select * from TableA where  id= '"+testCondition+"'"

在上面的例子中 如果用户输入的 ID 只是一个数字是没有问题的 可以执行正常的查询语句。但如果直接用“;”隔开,在 testCondition 里插入其他 SQL 语句,则会带来意想不到的结果,比如输入 drop,delete 等。 曾经在某业务中,用户在修改签名时,非常偶然地输入"#--!#"(@ 这样的内容用来表达心情,单击保存后触发数据库更新。由于该业务未对危险字符串 "#--"进行转义,导致 where 后边的信息被注释掉,执行语句变成

update table set memo= ""# -- !#(@ "where use_id=12345 ; 

SQL 语句的执行导致全库的 memo 字段都被更新。所以, SQL 注入的危害不 必赘述,注入的原理也非常简单。应该如何预防呢?这里主要从下面几个方面考虑 (1) 过滤用户输入参数中的特殊字符 ,从而降低被 SQL 注入的风险。 (2) 禁止通过字符串拼接的 SQL 语句 ,严格使用参数绑定传入的 SQL 参数 (3) 合理使用数据库访问框架提供的防注入机制。 比如 MyBatis 提供的#{}绑定参数,从而防止 SQL 注入。同时谨慎使用, {},{}相当于使用字符串拼接 SQL拒绝拼接的 SQL 语句,使用参数化的语句。 总之,一定要建立对注入式攻击的风险意识,正确使用参数化绑定 SQL 变量, 这样才能有效地避免 SQL 注入。实际上,其他的注入方式也是类似的思路。

参考书籍:《码出高效:Java开发手册》