2021年,SQL注入死透了么?

本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗 。转载本文请联系小姐姐味道公众号。  

[[386261]]

很长一段时间,我认为后端开发,在安全性方面最容易出问题的地方就在于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}会被替换成?。

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

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

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

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

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

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

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

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

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

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

  1. tag in 
  2. <foreach collection="tag" item="item" open="("separatosr="," close=")"> 
  3. #{tag}  
  4. </foreach> 

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

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

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

总结

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

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

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/140242.html<

(0)
管理的头像管理
上一篇2025-03-03 20:41
下一篇 2025-03-03 20:42

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注