需要两次调用mysql_real_escape_string()

时间:2013-08-08 03:58:34

标签: php mysql phpmyadmin mysql-real-escape-string magic-quotes-gpc

我有一些用户输入的数据被放入MySQL数据库(根据phpMyAdmin版本5.5.8) - 我发现下面的例子中mysql_real_escape_string()必须被调用两次或没有反斜杠添加到一个用户输入文字,例如“SHE'S伟大的船不是她”

当我尝试将那种类型的“包含引号的文本字符串”写入我的数据库时,会出现问题 - 用 no backslashes 将用户输入字符串写入数据库 - 除非我调用{ {1}}两次。

我使用phpMyAdmin来查看新编写的数据库记录,并且用户的带引号的text-string对引号没有ESCAPING(没有反斜杠)。如果我从数据库中读回该文本字符串,则引号不会被转义,即。我无需致电mysql_real_escape_string()来反转使用stripslashes()

代码如下。当我调用get_magic_quotes_gpc()时,它会显示已禁用。

我的期望是这样的:如果用户输入的文本字符串如“SHE'S GREAT BOAT IS NOT SHE” - 然后我再拨打mysql_real_escape_string() < / strong>在该用户输入文本上,并将其写入数据库,此一次调用mysql_real_escape_string()将创建一个如下所示的文本字符串:

\“SHE \是一艘伟大的船,不是”她

但是写入数据库的文本(见下文)显示了没有转义,只是原始的用户输入文本及其所有未转义的引号。

这是将用户文本字符串写入数据库的PHP代码:

mysql_real_escape_string()

当我使用phpMyAdmin查看数据库时,没有空格键入文本字符串。当从数据库中检索这个字符串时 - 它看起来像这样:“她是一个伟大的船不是她”

这让我觉得我接受了注射攻击。

所以我通过向// theUsersInputText contains "SHE'S A GREAT BOAT ISN'T SHE" $theText = $_POST['theUsersInputText']; $theDB = connectToDb(); // THIS ALWAYS REPORTS THAT MAGIC QUOTES ARE DISABLED if(get_magic_quotes_gpc()) echo "Magic quotes are enabled"; else echo "Magic quotes are disabled"; $theEscapedText = mysql_real_escape_string($theText); $newInsertQuery = "INSERT INTO " . "myDatabaseTable" . " VALUES " . "('" . $theEscapedText . "')"; 添加第二次调用来修改上面的代码,现在当我查看数据库时,最终文本字符串如下所示:

\“SHE \是一艘伟大的船,不是”她

以下是修改后的代码:

mysql_real_escape_string

在上面的内容之后,最后在phpMyAdmin中,当我查看刚编写的数据库记录时,文本看起来像:

\“SHE \是一艘伟大的船,不是”她

为什么我必须在这里拨打$theText = $_POST['theUsersInputText']; // NEW LINE OF CODE HERE $theStrangelyUnescapedText = mysql_real_escape_string($theText); $theDB = connectToDb(); // THIS ALWAYS REPORTS THAT MAGIC QUOTES ARE DISABLED if(get_magic_quotes_gpc()) showAlertBox("Magic quotes are enabled"); else showAlertBox("Magic quotes are disabled"); $theFinallyEscapedText = mysql_real_escape_string($theStrangelyUnescapedText); $newInsertQuery = "INSERT INTO " . "myDatabaseTable" . " VALUES " . "('" . $theFinallyEscapedText . . "')"; 两次?

2 个答案:

答案 0 :(得分:0)

以这种方式写作

$theEscapedText =  mysql_real_escape_string($theText);
$newInsertQuery = "INSERT INTO `myDatabaseTable`  VALUES ('$theEscapedText')";

我得到了查询输出

INSERT INTO `myDatabaseTable` VALUES ('\"SHE\'S A GREAT BOAT ISN\'T SHE\"')
斜杠是为了使查询在语法上正确并尽量避免sql注入,在db中查询将存储原始文本

"SHE'S A GREAT BOAT ISN'T SHE"

另请注意:自PHP 5.5.0起,不推荐使用Mysql_ *扩展,将来也会删除。相反,应该使用MySQLi或PDO_MySQL扩展。

有用的链接Why shouldn't I use mysql_* functions in PHP

答案 1 :(得分:0)

我决定使用heredoc并输出到文件,以确定我对mysql_real_escape_string()的第一次调用有什么影响(如果有的话)。我使用了以下代码 - 从用户输入中读取了php变量“theTextWithManyQuotes”,它是一个文本字符串,如  “O'Malley的父母的孩子的”选择“不是非典型的”

  $theTextWithManyQuotes = mysql_real_escape_string($_POST['userInput']);

  $html = <<<HEREDOC

  <!DOCTYPE html>
  <body>
    <textarea readonly name="adPreviewText" id="adPreviewText" rows="4" cols="60"
      style="border: none; border-style: none">$theTextWithManyQuotes</textarea>
  /body>
  </html>
HEREDOC;

file_put_contents("testfileonly", $html); 

然后我通过file_put_contents()将$ html变量转储到文件中并打开“testfileonly”文件 - 事实上反斜杠存在于文本中。

我的猜测是,当我构建一个mysql查询字符串并且它包含通过单次调用mysql_real_escape_string()进行转义的转义文本字符串时,数据库会以某种方式“隐藏”反斜杠,以便它们在phpMyAdmin中不可见查看数据库记录。

我的heredoc的内容,当输出到文件时,显示反斜杠存在的事实,它向我证明只需要调用mysql_real_escape_string(),并且mysql数据库以某种方式不显示(或剥离) ?)数据库记录中的反斜杠。当数据从数据库中读回时,不需要调用stripslashes(),当从数据库中读回时,文本字符串中不会出现反斜杠。