自动插入mysql_real_escape_string

时间:2013-02-26 18:43:47

标签: php mysql mysql-real-escape-string

免责声明:我理解这些功能是在待办事项清单之上。所有警告都只是传播给选民。

反正。我发现自己在使用mysql_ *函数的公司工作。这并不是很糟糕,因为整个事情没有mysql_real_escape_string()“伟大”。所有用户输入都没有被禁止,所以自然是新的代码猴子,我的工作是将它整合到所有4.93g的PHP脚本中。 F.M.L. “所以”,我心想,“如果我在每个页面上取消设置$_REQUEST数组(不确定原因,但他们从未在整个程序中使用$_POST$_GET一次,该怎么办?他们实际上在任何地方使用了$_REQUEST。)然后用mysql_real_escape_string重置它?“。对我来说,这肯定会超过10万行代码。 SO 我坐下来写了这个功能。这是我在的地方:

/*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_ *函数suck ie mysql_real_escape_string
  5. 作为附注,我甚至不能告诉你有多少次我想从PDO转换所有东西,你可以想象他们不喜欢所需的时间。

    SO

    我想我在这里给你们带来的是第二双眼睛。你觉得这有什么问题吗?我错过的任何其他直接问题?如果你们这样,无论如何,因为我确定还有其他人可以使用这样的东西(如果你建造它们会来的话),生病了,在github上通过它,并将它放到我的shcedule中,谢谢: )

2 个答案:

答案 0 :(得分: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可以使用,那么其他东西是非常错误的 - 没有任何应用程序永远那么大。这样大小的代码库完全无法维护,你可能最好完全重新开始(或者找一份新工作)。

答案 1 :(得分:1)

不应该自动插入mysql_real_escape_string。周期。

仅仅因为“使用mysql_real_escape_string重置数据”不是“保护数据免受SQL注入”的同义词。无论如何。

您实际上要做的只是重新体现长时间被鄙视,已弃用且已删除的magic quotes功能。
试着想一想原因 原因之一是 - 串行转义是SQL注入的可靠方法

只有一个音符。

  

mysql_ *函数很糟糕,即mysql_real_escape_string

这种说法不正确 这个诚实的功能是可以的 程序员正在不正确地使用它,负责任何故障。