3

可能重复:
mysql_real_escape_string 和单引号

编辑:我已经检查并且我的托管服务的 mysql 数据库设置为:

  Language: English (en-utf-8)
   MySQL charset: UTF-8 Unicode (utf8)

下面的“userItem”变量来自用户在表单上输入的文本字符串。

当我输入“这是 A 的用户项目”时——我在上面使用mysql_real_escape_string—— 这是保存到数据库的内容:

       "this is A\'s user item"

坏的。我的测试字符串保存了一个 backslsh。

如果我注释掉mysql_real_escape_string($userItem) 并在查询字符串中使用$userItem - 这就是存储在数据库中的内容:

       "this is A's user item"

好的!!没有反斜杠。

但让我们面对现实吧,出于安全原因,我真的很想使用mysql_real_escape_string —— 我被引导相信在将字符串保存到数据库之前对字符串使用 mysql_real_escape_string 更安全。

问题:当我检索我的文本字符串“这是 A\ 的用户项” 并将其显示在浏览器中时 - 它在字符串中有斜杠。这让用户感到惊讶——他们没有输入“这是 A 的用户项目”,而是输入了“这是 A 的用户项目”

这是代码:

 $newItemInsertQuery = "INSERT INTO " . Dbases::$USERITEMS_TABLE 
   . " VALUES "
   . "('" 
   . mysql_real_escape_string( $loggedInUser ) . "', '" 
  //. mysql_real_escape_string($userItem) . "', '" COMMENTED OUT due to extraneous backslash
   . $userItem . "', '"
   . mysql_real_escape_string($description) . "', '" 
   . mysql_real_escape_string($itemImage) . "', '"
   . mysql_real_escape_string($userSubfolder) .  "')";

   $result = mysql_query($newItemInsertQuery);

我怀疑以下内容;

  • 我期望在数据库插入之前对字符串使用 mysql_real_escape_string 是件好事是有效的。

  • 但我不知道必须采取的其他步骤

4

3 回答 3

2

强烈建议通过mysqlior使用参数化查询PDO(两者都是 PHP 内置的)。

mysql_real_escape_string()充其量只是权宜之计。使用参数化查询既不那么麻烦(避免这样的问题)又更安全——而且对于许多事情来说,它也可以更有效。

它还将更清楚地准确传递和进入数据库的数据,因为它不需要执行任何形式的任何转义。

于 2012-04-29T17:25:52.423 回答
0

在将字符串保存到数据库之前,对字符串使用 mysql_real_escape_string 会更安全。

它不是“更安全”。
这实际上是一个严格的规则

但是您的问题不是来自此功能,而是来自其他破坏数据的代码或设置。

所以,我们这里有两个问题。

  1. 如何让你相信这不是这个功能的罪魁祸首。
  2. 如何找到真正的原因。

对于第一个,请回显最终查询

echo $newItemInsertQuery;

并在这里发布你得到的

感谢您
现在发布让我们看看
您发布的查询由于语法错误将永远不会被执行。

INSERT INTO useritems VALUES ('b@b.com', 'b' s 4th item', 'the 4th item', '', '')

请参阅强调的部分:在这里,您的字符串文字已关闭,而后没有正确的语法关键字。

用这个改变你的查询电话

$result = mysql_query($newItemInsertQuery) or trigger_error(mysql_error()." ".$query);
exit;

看看

于 2012-04-29T17:40:55.583 回答
0

我相信我已经找到了额外反斜杠的来源以及解决方案。我会在这里发布,然后回来发布我目前正在研究的解决方案。

提交表单的 输入 type="text"字段,然后在 PHP 中的服务器端从 $_POST 数组中提取带有撇号的文本字符串并以显的方式显示时,斜杠已经在文本中字符串,像这样:

“这就是它的样子”

我无法使用我的网站目录中的 .htaccess 文件来使用该行关闭“魔术引号”

php_flag magic_quotes_gpc 关闭

由于 1and1 托管服务器显示错误(请参阅我上面对此的评论)并且不会运行我的网站。

我有一个解决方案,一旦得到证实,我会发回。

我已经测试了以下代码并且它可以工作 - 在我的表单上,我输入字符串"b's 6th item",当表单提交时,此代码处理表单的 POST:

 $itemName = $_POST['theItemname'];
 echo $itemName; 
 if (get_magic_quotes_gpc())
 {
    $stripped = stripslashes($itemName);
    echo "<br /> This is itemName string after stripping: " . $stripped;
 }

输出是:

     b\'s 6th item
     This is itemName string after stripping: b's 6th item

我已经阅读了您在下面的评论,并将查看所有选项。现在,我现在需要一个解决方案,上面避免调用stripslashes(),除非'magic quotes'打开——它有效。

我会准备好回复并尝试找到更优雅的方式!谢谢大家。

于 2012-04-29T19:58:09.933 回答