我正在审查一个基于 Linux 的 perl Web 应用程序,它包含一个登录处理程序
my $sth = $DB->prepare("SELECT password from passwords where userid='$userid'") or die; $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 注入攻击?为什么会这样?