一、什么是SQL注入
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
例如在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,这类表单特别容易受到SQL注入式攻击。
还有mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候需要防止sql注入。
二、SQL注入的例子
登录页面,输入账号密码验证登录,后台SQL简化(为演示方便,去掉密码的加密过程):
SELECT * FROM Login WHERE UserName='admin' AND Password='123456'
SQL注入,用户名栏输入“admin’–”,后台运行SQL为:
SELECT COUNT(*) FROM Login WHERE UserName='admin'-- Password='123'
因为UserName值中输入了“–”注释符,后面语句被省略而登录成功。(常常的手法:前面加上’; ’ (分号,用于结束前一条语句),后边加上’–’ (用于注释后边的语句))
三、防止SQL注入
1、数据库权限控制,只给访问数据库的web应用功能所需的最低权限帐户。
2、自定义错误信息,首先我们要屏蔽服务器的详细错误信息传到客户端。
3、尽可能使用参数化SQL,避免使用非参数化SQL,即动态拼接SQL。
4、mybatis中使用#{},避免使用${}
-
#{}使用预编译的语句,即底层使用JDBC的PreparedStatement占位符?,预编译,可以防止sql注入。
-
${}底层使用Statement ,字符串拼接,存在SQL注入风险。
5、输入数据转义
在模糊查询LIKE中,对于输入数据中的通配符必须转义,可使用ESCAPE关键字定义转义符