为什么将值传递给PHP函数然后将其转义并返回它是不安全的

时间:2012-10-30 22:35:36

标签: php mysql mysqli

我不知道这是不是一个好问题,但今天让我有了很多疑问。所以我使用PHP函数基本上节省时间和转义值,就像我们之前使用mysql_real_escape()一样,但我被告知这样做实际上很危险,这就是我在做的事情:

function mysql_string_safe($stringtoclean)
{
    $safestring = mysqli_real_escape_string($GLOBALS['confDBLink'],$stringtoclean);
    return $safestring;
}

我现在有疑问..如何做到这一点实际上是不安全的?既然我正在做的就是向函数发送一个值,然后在mysqli_real_escape_string中将其转义? (然后返回当然) 因此,当我真的想要逃避一个值时,我会做以下事情: mysql_string_safe($valuetoescape); 我真的很想知道,不仅因为有疑问,而且还知道,因为如果这是非常危险的,因为我被告知,那么我也会从我的应用程序中删除它。 非常感谢你的时间。

3 个答案:

答案 0 :(得分:4)

本身没有任何不安全因素,但使用预处理语句/绑定值比显式转义输入更受欢迎。由于以下几个原因,后者可能不安全:

  • 您可能忘记逃避输入
  • 您可能会意外地逃避相同的输入两次

答案 1 :(得分:1)

我愿意成为那个告诉你的人并不是指你有一个调用mysql_real_escape_string()的函数,而是指你使用mysql_*函数的事实所有。您可能已经看到此消息的变体,这解释了为什么您不应该使用这些功能:

Please, don't use mysql_* functions in new code。它们不再被维护,deprecation process已经开始了。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

答案 2 :(得分:0)

根据您的系统已使用mysqli的数量,我会切换到PDO:

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->bindValue(':username', $_POST['username']);
$stmt->execute();

$row = $stmt->fetch();

通过如图所示绑定值,PDO会为您处理字符的转义。这通常被认为是与PHP交互的改进方式,你可以在这里阅读:http://php.net/manual/en/book.pdo.php

我知道这并没有严格回答你的问题,我认为这是一个完全不同的解决方案可能有用的情况。