定义
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
原因分析
其本质是对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。
由于我们的部分WEB应用,采用Jsp+JavaBean或SSH框架,代码中会有直接写SQL(或HQL)语句,而有些SQL是用拼串实现的。
风险
SQL盲注:如果系统屏蔽了详细的错误信息,那么对攻击者而言就是盲注入,可能会查看、修改或删除数据库条目和表
使用SQL注入的认证旁路:可能会绕开 Web 应用程序的认证机制
预防措施
严格限定参数类型,明确参数检验的边界,必须在服务端执行数据验证
采用参数化查询的方法(推荐)
内置过滤系统(本质是黑名单,很常见但是不推荐)
数据库加固
扩展:使用jdbc的sql预编译;或者mybatis的预编译,用#{}给sql入参,如果参数是动态表名和列名时,只能使用“${xxx}”这样的参数格式,比如order by ${xxx},这就需要我们在代码中手工进行处理来防止注入。