我被分配到我公司的一个遗留 Web 应用程序,在研究源代码一两天后,我发现了一个类似于以下内容的 SQL 注入(inject)向量:
mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");
我已经尝试对此执行 SQL 注入(inject)测试,但由于 PHP 的 magic_quotes_gpc
模块被打开而失败了。
我知道 magic_quotes_gpc
脏,但我们有数百(如果不是数千)行代码与上面的代码类似。我们根本无法关闭 magic_quotes_gpc
,因为这会让像这样的代码容易受到攻击。
我想知道上面的代码有多“可利用”,我们是应该立即修复它,还是将修复它的任务与我们的其他重构任务一起进行。
最佳答案
从 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 插值以使用它。当您获得所有这些后,您可以关闭魔术引号。
关于PHP magic_quotes_gpc 漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127028/