3

我被分配到我公司的一个遗留 web 应用程序中,经过一两天的源头搜索后,我发现了一个类似于以下内容的 SQL 注入向量:

mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");

我试图对此执行 SQL 注入测试,但由于 PHP 的magic_quotes_gpc模块被打开,它失败了。

我知道magic_quotes_gpc很脏,但是我们有数百行(如果不是数千行)类似于上面的代码。我们根本无法magic_quotes_gpc关闭,因为这会使像这样的代码很容易受到攻击。

我想知道上面的代码有多“可利用”,以及我们是否应该立即修复它,或者将修复它的任务包含在我们的其他重构任务中。

4

3 回答 3

7

转换站点的常用方法magic_quotes_gpc是添加一个包装函数:

function m($s) {
    if (get_magic_quotes_gpc())
        $s= stripslashes($s);
    return mysql_real_escape_string($s);
}

mysql_query("SELECT * FROM foo WHERE bar='".m($_GET['baz'])."'");

这将解决addslashes无法识别字符集的问题,该问题在某些情况下可能导致其易受攻击,并且通常会使代码继续像以前一样“工作”。

然而,从长远来看,依赖输入转义是不可持续的,因为它会将斜杠乘以您未插入数据库的输入字符串,并且无法转义您从其他来源插入数据库的字符串。这是magic_quotes_gpc错误的真正原因:它将输出级编码应用于输入级。

所以添加包装函数,然后慢慢更新所有 SQL 插值以使用它。当你拥有它们时,你可以关闭魔术引号。

于 2010-01-24T12:46:17.310 回答
0

只要打开了魔术引号,并且您不使用一些可能使事情通过它的特殊字符编码,您就应该没问题 - 可以这么说。问题是,无论出于何种原因,魔术引号都不起作用(服务器更改,配置更改),您将有很多漏洞需要修复。

于 2010-01-24T12:47:37.770 回答
-1

我会在开头添加一行以确保启用了magic_quotes,即使它们在服务器配置中被禁用。然后你或多或少会安全。

于 2010-01-24T12:51:05.910 回答