2021年,SQL注入死透了么?

news/2024/7/3 17:50:41

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

很长一段时间,我认为后端开发,在安全性方面最容易出问题的地方就在于SQL注入。通过 where 1=1这种魔幻的SQL写法,就可以很容易的对一个存在问题的系统进行攻击,以至于最终演进出sqlmap这样的神器存在。

后来的fastjson刷新了我的认知,这个框架也算是对互联网安全概念的一种推动。连不懂技术的老板,都知道fastjson快的要命,作为程序员安全理念就得到了一次提升。

为什么对sql注入情有独钟?因为开发人员和SQL打交道的地方太多了。甚至有的专门开发报表的同学,写的SQL行数,比写的代码行数还多!

问题是。很久很久之前,早在10年前,就有人在喊SQL注入已经死掉了,但时至今日,依然有一大批的SQL注入教程和SQL注入的案例。

SQL注入是漏洞之王,这可不是吹的。

当然在这方面,PHP的贡献最大,Java甘拜下风。

SQL注入流行的原因,就是开发人员对自己太自信了,或者使用的工具太原始了,没有经过框架层进行一次过滤。如果你用了Java界的MyBatis或者JPA,发生SQL注入的可能性就变的非常的低。现在PHP也有了类似于thinkphp一样的框架,代表着能搞的SQL注入漏洞已经越来越少了。

但不代表着没有,只是门槛提高了。我们以MyBatis为例,看一下到底还能不能发生SQL注入。

MyBatis依然存在SQL注入

使用Mybatis的同学,第一个接触的概念,就是#$的区别。这两个符号非常的像Shell中的魔幻符号,但好在只有两种情况。

  • #  代表的是使用sql预编译方式,安全可靠

  • $ 代表着使用的是拼接方式,有SQL注入的风险

比如下面这个xml配置,就是一个绝对安全的写法。因为整个#{id}会被替换成?

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM order WHERE id = #{id}
</select>

但可惜的是,有些场景,并不能使用预编译方式(或者你仅仅是不知道或者懒)。像一些代码重构,把表名/列名/排序等字段,动态传入的时候,不可避免的就需要SQL拼接的方式,SQL注入依然有搞头。

但更容易发生问题的,还是LIKEIN等类似的语句。

下面是两句Like模糊查询的写法,实际测试会发现,使用#竟然不好使了,会报错,需要使用sql拼接的$。问题由此发生。

SELECT * FROM order WHERE name like '%#{name}%'  //会报语法错
SELECT * FROM order WHERE name like '%${name}%'  //可以运行

而正确的写法,应该使用函数拼接。但是工期压死人,在不知不觉间,大多数人就选择了简单的写法。毕竟功能第一嘛,也是体现工作量的最主要方式。

SELECT * FROM order WHERE  name like concat(‘%’,#{name}, ‘%’) //正确的写法

同样的问题,存在于IN语句。

in (#{tag}) //报错
in (${tag}) //可以运行

既然几个字符就可以运行,当然没人选择下面复杂的写法。

tag in
<foreach collection="tag" item="item" open="("separatosr="," close=")">
#{tag} 
</foreach>

还有order by,也千万不要掉以轻心,一不小心就会万劫不复。

SELECT * FROM order order by createDate #{sortType} //报错
SELECT * FROM order order by createDate ${sortType} //正常

这种情况下,就需要把sortType搞成白名单了。不就一个ASC和DESC了,你给我传一个长长的串,是怎么回事?

总结

SQL注入在2021年,依然存在,只不过门槛提高了。现在SQL注入减少,都是框架的功劳,和程序员的水平没半毛关系。sql拼接的情况永远不会消失,因为这是最快捷简单的方式,会让人欲罢不能。无数的外包项目,十几年躺尸不动的系统比比皆是,寄希望于在框架层全部消灭SQL注入,是一个梦想。

因为它的对手,是人性的懒惰。谁也无法战胜它。

作者简介:小姐姐味道  (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

推荐阅读:

1. 玩转Linux
2. 什么味道专辑

3. 蓝牙如梦
4. 杀机!
5. 架构师BUG,非比寻常


http://www.niftyadmin.cn/n/3061224.html

相关文章

锂矿是反弹的前锋

连续第二天&#xff0c;锂矿是锂电池的前锋&#xff0c;锂电池是大盘的中军。一根大阳改三观&#xff0c;可能不适用锂矿。但是一根大阳算反抽&#xff0c;两根大阳算反弹&#xff0c;不能说成立&#xff0c;应该是可以期待的。尤其是在创业板跌1.83个点&#xff0c;锂电龙头宁…

django结合apache部署

下载安装mod_wsgi 这里我的版本是mod_wsgi-3.4.tar.gz 在django的目录建立一个test.wsgi 这里我的目录是/var/www/html/Simplecmdb 建立一个test.wsgi 123456789def application(environ, start_response):status 200 OK output Hello World! response_headers [(Content-ty…

宁德时代一季报暴雷!天齐锂业和赣锋锂业一前一后保驾护航

天齐锂业一季度业绩爆了&#xff01;净利润33.28亿元&#xff0c;同比增长14倍。一季度利润是去年全年的1.6倍。天齐锂业2022年第一季度营收约52.5亿元&#xff0c;同比增加481%&#xff1b;归属于上市公司股东的净利润约33.2亿元&#xff0c;同比增加1442%&#xff1b;扣非净利…

永恒话题单点登录,OAuth2版本

作者&#xff1a;废物大师兄www.cnblogs.com/cjsblog/p/10548022.html1. 前言技术这东西吧&#xff0c;看别人写的好像很简单似的&#xff0c;到自己去写的时候就各种问题&#xff0c;“一看就会&#xff0c;一做就错”。网上关于实现SSO的文章一大堆&#xff0c;但是当你真的…

DBeaver,杀出重围!

原创&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;&#xff0c;欢迎分享&#xff0c;转载请保留出处。我最近装上了DBeaver&#xff0c;原因是很多人捧它。好家伙&#xff0c;很好用。但从打开它的第一眼&#xff0c;我就知到它的开发语言是J…

锂矿降龙十八掌之时乘六龙

锂矿&#xff0c;有价格利润与股票走势的巨大剪刀差&#xff0c;有周期与成长的巨大争议&#xff0c;有暴涨暴跌的疯狂与落寞。锂矿&#xff0c;以新能源时代的战略资源“白色石油”之名&#xff0c;见证了史无前例的价格暴涨与利润爆炸、股价暴涨与暴跌、周期与成长的争议&…

【缓存中间件】Redis哈希槽的概念

数据分布理论 分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题&#xff0c;即把数据集划分到多个节点上&#xff0c;每个节点负责整体数据的一个子集。。 需要重点关注的是数据分区规则。常见的分区规则有哈希分区和顺序分区两种&#xff0c;哈希分区离散…

实用ExtJS教程100例-006:ExtJS中Window的用法示例

在前面几个示例中&#xff0c;我们演示了MessageBox的各种用法&#xff0c;今天这篇文章将演示如何使用Window。 我们首先来创建一个窗口&#xff1a; var win Ext.create("Ext.window.Window", {title: "标题 - www.qeefee.com", //标题height: 20…