我正在审查一个基于Linux的perl Web应用程序,它包含一个无处不在的登录处理程序
我的$ sth = $ DB-> prepare("从密码中选择密码,其中userid ='$ userid'")或死; $ sth->执行或死亡; ...
其中$ userid是从(不安全,未经过滤的)Web用户输入初始化的.
众所周知,DBI文档建议应该更改此代码以使用占位符"?" 取代'$ userid'以获得安全性.
出于安全审查的目的,此代码在离网网络盒上被隔离. 互联网服务器上的这样的代码最终将被破解,因为现在有机器人扫描此漏洞.访问控制对于保护任何重要内容也无效,因为已知注入可以删除数据库,插入错误数据或新用户,或绕过访问控制以允许进入Web应用程序.
由于应用程序可以配置为使用PostgreSQL或MySQL,并且提出了有关比较漏洞的问题,我尝试了两个数据库并使用一些SQL注入尝试测试了每个配置.
在PostgreSQL下输入'; 在这里做坏事; 和这里; 会按预期崩溃登录cgi并执行坏东西.
出乎意料的是MySQL抵制了这次攻击.这让我想知道是否有某种类型的设置为DBD :: MySQL或其他地方限制为每次调用准备1个语句,或者是MySQL以其他方式抵抗.
据我所知,MySQL一般不具备SQL注入抗性.
这不仅仅是关于消除SQL注入的技术的问题; 或许看看如何避免SQL注入攻击?.
问题是:在PERL DBI下MySQL是否比PostgreSQL对SQL注入攻击更具抵抗力,为什么会出现这种情况?