1

我不知道这是否是一个好问题,但今天让我产生了很多疑问。所以我使用了一个 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); 我真的很想知道,不仅因为怀疑,而且还想知道,因为如果这真的像我被告知的那样危险,然后我也会从我的应用程序中删除它。非常感谢您的宝贵时间。

4

3 回答 3

4

本身没有什么不安全的,但是使用准备好的语句/绑定值比显式转义输入更可取。由于以下几个原因,后者可能不安全:

  • 您可能忘记转义输入
  • 您可能会不小心将相同的输入转义两次
于 2012-10-30T22:40:10.463 回答
1

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

请不要mysql_*在新代码中使用函数。它们不再被维护,并且已经开始弃用过程。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

于 2012-10-30T22:41:16.447 回答
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

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

于 2012-10-30T22:49:26.230 回答