关于sql注入
最近公司内的一段代码被安全中心扫出了 sql 注入漏洞,hacker 可以直接通过构造参数获取数据库结构、内容,甚至写数据,危害非常大,当然我们也在第一时间修复了,幸好没有造成太大影响,这里做一下总结:
1. sql 注入原理
所谓 sql 注入就是通过把 sql 命令插入到 Web 表单或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 sql 命令的目的。举例:
1 -- 期望客户输入客户 id 查询客户信息,如 id = 5,查询语句为: 2 3 select * from User.user where id = 5; 4 5 -- 结果客户输入的客户 id 为 " 1 or 1",查询语句为: 6 7 8 select * from User.user where id = 1 or 1; 9 10 -- 结果是全部的客户信息都被 dump 出来
2. 防范措施
- 参数校验
- 参数校验!参数校验!参数校验!参数校验做好了基本就没有了 sql 注入,假若本来期望的就是整形,那么就严格校验参数是整形,不是就拒绝。
- 这里要特别注意下字符串,web 开发语言都有类似 sql escape 的函数来预处理一下字符串,那么字符串参数传入时一定要用这类函数预处理。php 是 mysql_escape_string 和 mysql_real_escape_string
- 使用成熟的 orm
- 使用成熟的 orm 而不是通过裸写 sql 的方式访问数据库。成熟 orm 一般都会有防止 sql 注入的逻辑,且逻辑清晰易于管理。裸写 sql 晦涩难懂,容易出错,尽量避免。
- 限制业务代码 sql 操作权限
- 业务逻辑代码的 sql 操作权限只限制在增、删、查、改,而不要其他的 drop 等危险操作,甚至于删数据的操作都可以改为变更数据的状态。