我有一些用户输入的数据被放入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 . . "')";
两次?
答案 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扩展。
答案 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(),当从数据库中读回时,文本字符串中不会出现反斜杠。