在盲代码中使用mysql_real_escape_string

时间:2014-03-02 18:31:30

标签: php mysql security sql-injection mysql-real-escape-string

我的客户端在其生产服务器上有大量代码,现在我们正在保护此服务器。 他们有SQL漏洞有代码,所以我们正在添加 这些命令在代码的开头。这是否会暂时解决问题。

$_POST = array_map('mysql_real_escape_string', $_POST);
$_GET = array_map('mysql_real_escape_string', $_GET);
$_REQUEST = array_map('mysql_real_escape_string', $_REQUEST);

1 个答案:

答案 0 :(得分:4)

我们无法判断这是否解决了这个问题,因为我们看不到应用程序代码是如何使用 $_GET$_POST和{ {1}}变量。它实际上可能会破坏请求变量的其他用途,迫使它们全部转义。

  • 您可以在SQL中将它们用作未加引号的数值,而不是引用的字符串或日期文字。除非您在SQL中引用值,否则转义无效。
  • 您可以将它们用作列名,SQL关键字等。转义只适用于字符串和日期,它不会逃避后退。
  • 您可能根本不在SQL中使用它们。您可以将它们用于其他函数参数,或者用$_REQUEST语句或关联数组键等。

基本上,你正在尝试做与魔术引号相同的事情,但magic quotes was deprecated因为拥有一个通用的安全解决方案是一个坏主意。这只是基于太多的假设,结果证明不是真的。

正确的解决方案(如果你现在必须坚持使用ext / mysql)是在SQL 中使用它们时应用过滤或转义来请求变量

当然最好升级到ext / mysqli或PDO,并使用查询参数。但是我意识到要将大型代码库调整为新的API需要做很多工作,而且您正在寻找短期内可以做的事情。

您还可以查看mod_security,它可以帮助您过滤掉可疑的请求变量模式,而无需更改任何PHP代码。但是,设计适用于您的应用的mod_security规则也可以做很多工作,而不会阻止合法请求。