关于sql注入

Posted lian4187

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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 等危险操作,甚至于删数据的操作都可以改为变更数据的状态。

以上是关于关于sql注入的主要内容,如果未能解决你的问题,请参考以下文章

关于sql注入

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

关于SQL注入(有例子)以及我的一些想法

mybatis以及预编译如何防止SQL注入

spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段