我有一些用户输入数据被放入 MySQL 数据库(根据 phpMyAdmin 为 5.5.8 版) - 我发现mysql_real_escape_string()
在下面的示例中必须调用两次,否则不会将反斜杠添加到用户输入文本中,例如“SHE'S A伟大的船不是她”
当我尝试将那种类型的“包含引号的文本字符串”写入我的数据库时会出现问题——用户输入字符串被写入数据库时没有反斜杠——除非我调用mysql_real_escape_string()
两次。
我使用 phpMyAdmin 查看新写入的数据库记录,并且用户的 text-string-with-quotes 在引号上没有转义(没有反斜杠)。如果我从数据库中读回该文本字符串,则不会转义引号,即。我不必调用stripslashes()
来反转使用mysql_real_escape_string()
.
代码如下。当我调用 get_magic_quotes_gpc() 时,它显示它们已被禁用。
我的期望是这样的:如果用户输入一个文本字符串,如“SHE'S A GREAT BOAT ISN'T SHE” ——然后我在该用户输入文本上调用mysql_real_escape_string()
一次,并将其写入数据库,这 一次调用将mysql_real_escape_string()
创建如下所示的文本字符串:
\"她\'SA GREAT BOAT ISN\'T She\"
但是写入数据库的文本(见下文)显示没有转义,只是原始用户输入文本及其所有未转义的引号。
这是将用户文本字符串写入数据库的 PHP 代码:
// 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 . "')";
当我使用 phpMyAdmin 查看数据库时,文本字符串中没有斜线。当从数据库中检索这个字符串时——它看起来像这样: “SHE'S A GREAT BOAT ISN'T SHE”
这让我觉得我很容易受到注射攻击。
所以我通过添加第二个调用来修改上面的代码mysql_real_escape_string
,现在当我查看数据库时,文本字符串最终看起来像这样:
\"她\'SA GREAT BOAT ISN\'T 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 . . "')";
经过以上,最后在phpMyAdmin中,当我查看刚刚写好的数据库记录时,文字看起来是这样的:
\"她\'SA GREAT BOAT ISN\'T She\"
为什么我要mysql_real_escape_string()
在这里打两次电话?