author:彭程
介绍
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。系统环境不同,SQL注入可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。
什么是SQL注入
SQL注入往往是通过输入框将一些恶意的SQL命令传递到后端,最常见的场景就是登录界面,界面提示输入用户名和密码,后端根据传递的用户名和密码进行查询,返回数据。
SELECT * FROM user WHERE username='admin' AND password='passwd'
如果后端是采用SQL拼接的方式,那么当攻击者输入的用户名为’or 1 = 1 —时,后端拼接的SQL就为
SELECT * FROM user WHERE username='' OR 1 = 1 --' AND password='passwd'
这里where后的条件有or 1=1就一定为true,且—符号会将后面的SQL注释掉,这样就一定能登录成功,如果攻击者在后面添加一些drop等语句造成的影响将更大。
如何防御SQL注入
- 绑定变量,使用预编译语句
预编译语句使用占位符?代替变量,先将SQL语句中可被客户端控制的参数集进行编译,生成对应的临时变量集,再使用对应的设置方法,为临时变量集里面的元素进行赋值,赋值函数setString(),会对传入的参数进行强制类型检查和安全检查,所以就避免了SQL注入的产生。
根本上来说SQL注入是改变了SQL语句的结构,而预编译能把结构固定,从而只能影响参数,避免SQL注入。
如使用mybatis框架时尽量使用#{}进行参数传递,而不要使用${},因为#{}会进行预编译
- 传入参数过滤
可以对传入的参数进行检查过滤,就能避免如—注释符号造成的SQL注入
- 仅给予需要的最低权限
对于不同的账户只给予其需要的最低权限,对于查询账户不允许其执行delete、insert等操作
- 用存储过程来执行所有的查询
- 对用户数据进行加密
