-1

免责声明:我了解这些功能位于待办事项弃用列表的顶部。所有的警告都只是在向合唱团宣讲。

反正。我发现自己在一家使用 mysql_* 函数的公司工作。这显然还不够糟糕,因为整个事情都没有mysql_real_escape_string()“伟大”。所有的用户输入都是未经处理的,所以自然而然地成为新的代码猴子,我的工作是将它合并到所有 4.93g 的 php 脚本中。FML“所以”,我心想,“如果我只是$_REQUEST在每一页上取消设置数组(不知道为什么,但他们从未使用过,$_POST或者$_GET在整个程序中使用过一次,他们确实$_REQUEST在任何地方都使用过。)然后用mysql_real_escape_string? 重置它。”。对我来说,这肯定胜过 1000000000 行代码。所以我坐下来写了函数来做这件事。这是我所在的位置:

/*lets say input is dirty and input2 is boy*/

    echo "<br><pre>";print_r($_REQUEST);echo "</pre><br>";

$tempString = implode(',', $_REQUEST);
$tempString2 = implode(',', array_keys($_REQUEST));
$tempArray = explode(',', $tempString);
$tempArray2 = explode(',', $tempString2);
$count = count($_REQUEST);
    echo "<br><pre>";print_r($tempArray);echo "</pre><br>";

    echo "<br>";
    echo "<br><pre>";print_r($tempArray2);echo "</pre><br>";

unset($_REQUEST);
   $_REQUEST = array();
   for($i = 0; $i < $count; $i++){
       $_REQUEST[$tempArray2[$i]] = "mysql_real_escape_string(".$tempArray[$i].")";
   }

    echo "<br><pre>";print_r($_REQUEST);echo "</pre><br>";

据我所知,它正在工作!:

Array
(
    [input] => dirty
    [input2] => boy
)


Array
(
    [0] => dirty
    [1] => boy
)



Array
(
    [0] => input
    [1] => input2
)


Array
(
    [input] => mysql_real_escape_string(dirty)
    [input2] => mysql_real_escape_string(boy)
)

但坦率地说,这似乎太容易了。我看到的直接问题是

  1. 它只适用于$_REQUEST[]
  2. 您必须在每个页面的顶部对其进行硬编码,即使您将其设置为全局函数并包含它
  3. 如果一件事出了差错...
  4. mysql_* 函数很糟糕,即mysql_real_escape_string

作为旁注,我什至无法告诉您我为从 PDO 转换所有内容而奋斗了多少次,因为您可以想象他们不喜欢所需的时间。

所以

我想我把这个带到你们这里是为了,第二双眼睛。您对此有什么直接的问题吗?我错过的任何其他直接问题?如果你们喜欢这个,无论如何,我确信还有其他人可以使用这样的东西(如果你构建它,他们会来的),我会继续在 github 上通过它并将它的工作到我的 shcedule 中,谢谢: )

4

2 回答 2

2

首先,您当前所做的事情毫无意义。您实际上是在将单词包装mysql_real_escape_string(...)在用户输入周围,这完全没有意义。它不能防止 SQL 注入,这意味着该词mysql_real_escape_string将出现在您的输入中。

如果您改为调用 mysql_real_escape_string()所有用户输入,那么您将拥有的将是一个不完美的复制品magic_quotes,并且会带来所有问题。特别是,这意味着任何不将用户输入直接传递给 SQL(或mysql_real_escape_string适当地使用自身!)的代码最终都会显示 SQL 转义文本(例如,\'到处都是)。

除了实际检查您的代码并对其进行修改以适当地转义用户输入之外,没有其他真正的选择。但是,如果您确实有 4.93 GB 的 PHP 可以使用,那么其他事情就大错特错了——任何应用程序都不应该那么大。这种规模的代码库是完全不可能维护的,你最好完全重新开始(或找到一份新工作)。

于 2013-02-26T19:03:06.917 回答
1

不应自动插入 mysql_real_escape_string。时期。

仅仅因为“使用 mysql_real_escape_string 重置数据”不是“保护数据免受 SQL 注入”的同义词。以任何方式。

您实际上想要做的只是重新体现长期以来被鄙视、弃用和已删除的魔术引号功能。
试着想想原因。
原因之一 - 串行转义是 SQL 注入的可靠方法

只有一个注释。

mysql_* 函数很烂,即 mysql_real_escape_string

这种说法是不正确的。
这个诚实的功能是可以的。程序员使用不当,对任何错误负责

于 2013-02-26T19:30:44.133 回答