SQL注入及如何避免
定义
sql注入实际上就是在用户输入的字符串中加入sql语句,如果在程序设计中忽略了检查,那么这些加入的sql语句就会被数据库服务器误认为是正常的sql语句从而参与运行。攻击者便可借此得到未经授权的数据。
原理
1.恶意拼接查询
传入的参数中拼接了其他的sql语句 导致执行了注入的非法sql
SELECT * FROM users WHERE user_id = **$user_id**
SELECT * FROM users WHERE user_id = **1234; DELETE FROM users**
2.利用注释执行非法命令
传入的参数中加入了”–“ 这导致后面内容被判定为注释
SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version
SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--
3.传入非法参数
非法参数 ’ 的出现会导致查询条件值的改变
SELECT * FROM user_name WHERE user_name = $user_name
SELECT * FROM user_name WHERE user_name ='G'chen'
4.添加额外条件
额外条件导致所有用户密码被更改
UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;
UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;
避免SQL注入的一些方法
- 过滤输入内容,校验字符串:数据提交到数据库之前,对其中的不合法字符进行剔除。也可以验证输入数据的类型是否符合要求。
- 参数化查询:目前被认为是最有效的预防sql注入方法。需要填入数据的地方,使用参数(Parameter)来给值 先把参数用?代替 ,再编译后再填入参数具体值。就算有破坏指令,也不会被执行
- 安全测试、安全审计:开发中对代码进行审查,测试环节进行测试,上线后定期扫描安全漏洞
开发中一些可以避免注入的方法
- 避免使用动态sql 最好使用准备好的语句和参数化查询 避免将用户输入的数据直接放入sql
- 不要将敏感数据保留在纯文本中 加密数据库中的敏感数据 以防攻击者排出敏感数据
- 限制数据库访问权限和特权
- 避免直接向用户显示数据库报错 攻击者可能使用这些错误消息来获取数据库信息