加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

怎样避免出现SQL注入漏洞

发布时间:2022-02-10 10:06:58 所属栏目:安全 来源:互联网
导读:将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。 SQL注入漏洞的原理、形成原因;SQL注入漏洞,根本上讲,是由于错把外部输入当作SQL代码
      将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。
 
      SQL注入漏洞的原理、形成原因;SQL注入漏洞,根本上讲,是由于错把外部输入当作SQL代码去执行。目前最佳的解决方案就是预编译的方式。
 
      SQL语句在执行过程中,需要经过以下三大基本步骤:代码语义分析;制定执行计划;获得返回结果;而一个SQL语句是由代码和数据两部分,如:复制SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   1.SELECT id, name, phone FROM userTable WHERE name = 是代码,'xiaoming'是数据。
 
      而预编译,以Mybatis为例,就是预先分析带有占位符的语义:如SELECT id, name, phone FROM userTable WHERE id = #{name};然后再将数据'xiaoming',传入到占位符。这样一来,错开来代码语义分析阶段,也就不会被误认为是代码的一部分了。
 
      在最早期,开发者显式使用JDBC来自己创建Connection,执行SQL语句。这种情况下,如果将外部可控数据拼接到SQL语句,且没有做充分过滤的话,就会产生漏洞。这种情况在正常的业务开发过程中已经很少了,按照公司规定,无特殊情况下,必须使用ORM框架来执行SQL。但目前部分项目中,仍会使用JDBC来编写一些工具脚本,如DataMerge.java 、DatabaseClean.java,借用JDBC的灵活性,通过这些脚本来执行数据库批量操作。
 
此类代码不应该出现在线上版本中,以免因各种情况,被外部调用。直接使用Mybatis:1. 易错点;目前大部分的平台代码是基于Mybatis来处理持久层和数据库之间的交互的,Mybatis传入数据有两种占位符{}和#{}。{}和#{}。{}可以理解为语义分析前的字符串拼接,讲传入的参数,原封不动地传入。
 
比如说;复制SELECT id, name, phone FROM userTable WHERE name = '${name}';   传入name=xiaoming后,相当于复制SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   实际应用中复制
SELECT id, name, phone FROM userTable WHERE ${col} = 'xiaoming';   传入col = "name",相当于复制SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   就像预编译原理介绍里讲的一样,使用#{} 占位符就不存在注入问题了。但有些业务场景是不可以直接使用#{}的。
 
如果编写SELECT id, name, phone FROM userTable ORDER BY #{}; ,执行时是会报错的。因为order by后的内容,是一个列名,属于代码语义的一部分。如果在语义分析部分没有确定下来,就相当于执行SELECT id, name, phone FROM userTable ORDER BY 。肯定会有语法错误。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读