怎么确定SQL注入死透了

56次阅读
没有评论

共计 1920 个字符,预计需要花费 5 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下怎么确定 SQL 注入死透了,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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

怎么确定 SQL 注入死透了

后来的 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 注入依然有搞头。

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

下面是两句 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 注入,是一个梦想。

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

以上是“怎么确定 SQL 注入死透了”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1920字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)