MySQL比PostgreSQL(在Perl/DBI下)更能抵抗SQL注入攻击吗?

Pau*_*aul 4 mysql postgresql perl sql-injection dbi

我正在审查一个基于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注入攻击更具抵抗力,为什么会出现这种情况?

Bob*_*ica 11

防止注入攻击不是数据库的责任,它是开发人员的责任.如果开发人员编写通过连接从用户输入派生的字符串来创建查询的代码,则生成的查询将容易受到注入攻击,并且所有用于清理等的代码都是恕我直言,浪费时间.如果编写代码以使用参数化查询,并且用户输入被降级为用作参数值,则生成的查询将在注入攻击中相当安全.(我有兴趣听听如何通过参数值进行注射攻击).

分享和享受.


小智 8

默认情况下,MySQL客户端库似乎限制为每个调用一个语句(我在PHP中遇到过它).

但是,这不应该是使用MySQL而不是PostgreSQL的理由,因为您仍然可以使用子查询进行注入.

  • 从4.1开始,MySQL支持多个语句.许多客户没有效仿,或者默认情况下将其保留以保持兼容性.如果打开*mysql_multi_statements*,DBD :: mysql允许执行多个语句.因此,对MySQL的单语句处理的精简保护是维护程序员添加的一条线,而不是消失. (8认同)