SQL预编译来防止注入攻击的探讨

SQL注入在原理上被根除的是使用预编译。其实SQL注入没有断绝,主要原因有四个:1.预编译不能解决所有SQL注入:例如,表名/列名/排名动态传入的场景,因为这些场所不能预编译,所以很多人直接连接起来,受到对预编译的信赖,从外到内没有过滤。


2.可预编译的地方也可能存在问题。注入一般爆炸性的LIKE语句/IN语句,这两个地方的预编译法有点特殊,很多开发者不擅长,所以直接连接起来了。3.在SQL语句的写法中,直接连接比预编译简单得多,没有接触过信息安全的初学者写的代码,即使是有经验的程序员,也没有时间考虑信息安全的问题。4.有漏洞的旧代码太多,或者无法更换预编译,只能靠WAF生存,WAF本身就是用户体验和安全性之间的矛盾集团,有可能被绕过。


sql注入本质上是由于开发人员安全意识薄弱,将用户可控参数直接连接到句子中,使数据突破约束成为代码执行引起的传统计算机漏洞。那么,为什么会断绝呢?开发商安全意识好了吗?还是预编译被普及了?

不,真正的原因是各种框架的流行和普及。例如,thinkphp在处理查询时,开发开发者自己连接语言,而是对象化查询。普通程序员在框架的祝福下,即使没有安全意识也不会注入。如果必须用tp也有自己连接sql的方法的话就没意思了。随着现在各种框架的流行,大家不是轮子,而是更加重视实现,这些框架本身是由有经验的开发者开发的,安全性很高。目前,sql注入基本上只出现在历史遗留站,或者没有使用框架的边缘业务站。之后sql注入真的会消失吗?不,但黑盒渗透测试下的sql注入会消失。白盒渗透测试时,各大框架都有sql注入。


这表明今后单纯的网络渗透测试,也就是说,看到以前的参数加单引号的人会消失,本质上对这个脆弱性没有真正的打击。时代在进步,00年出现各种愚蠢的基础溢出提升权洞,几年前随意在参数后面加上单引号就能找到sql注入,不是异曲同工的妙处吗?黑盒时的sql注入越来越少,直到消失。但是,如果有人审计框架的sql注入,则会导致大范围的sql注入脆弱性。sql注入只是门槛提高了,和以前的底层一样,但不会消失。


今后白盒的sql注入也会消失吗?不,现在的关于新开发的系统,SQL注入的危害确实减少了。实现这一点的不是大家的安全意识的提高,而是使用预编译,知道很多成熟的框架和部件,自己考虑到安全性,让开发者写出更安全的代码。

分享: