【问题标题】:mysql_real_escape_string adds a slash '\' when saving word with apostrophe in it to database [duplicate]mysql_real_escape_string 在将带有撇号的单词保存到数据库时添加斜杠“\”[重复]
【发布时间】:2012-04-29 17:11:49
【问题描述】:

可能重复:
mysql_real_escape_string and single quote

编辑:我已经检查并且我的托管服务的 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 更安全将它们添加到数据库中。

问题:当我检索我的文本字符串 "this is A\'s user item" 并将其显示在浏览器中时——字符串中有斜杠。这让用户感到惊讶——他们没有输入 “这是 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 是件好事。

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

【问题讨论】:

  • 请在 $userItem; 之前立即回显 mysql_real_escape_string() 并发布结果 - 您可能在其他地方还有其他转义。
  • @Eugen -- 我已经回显了 $userItem 并且没有任何反斜杠 -- 在其他地方没有应用其他转义。
  • 在别处找到这个:stackoverflow.com/questions/1522313/…
  • @wantTheBest 根本不可能。仔细检查它
  • @wantTheBest 你在哪里查到的?最好取消注释并回显整个查询

标签: php mysql mysql-real-escape-string


【解决方案1】:

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

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

它还可以更清楚地了解传入和进入数据库的数据,因为它不需要执行任何类型的转义。

【讨论】:

  • 但这并不能解决问题(数据被过早转义)。
  • 这应该是一条评论。它没有回答问题,只是指出了其中的不良做法。
  • 这个功能没什么不好如果使用得当
  • @YourCommonSense 除了它本质上是在自找麻烦之外......例如,如果你在替换它时忘记在其结果周围加上引号,等等。
  • 它不要求任何东西。使用它的 PDO 一直是等效的。 忘记是一个主观的东西,不会使功能本身变坏。所以,直截了当,我部分同意你的看法:直接在代码中使用这个函数,而不是作为更高级别保护设施的一部分显然是坏事。
【解决方案2】:

在将字符串保存到数据库之前对字符串使用 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;

看看

【讨论】:

  • 这是插入数据库之前的回显查询字符串:INSERT INTO useritems VALUES ('b@b.com', 'b's 4th item', 'the 4th item ', '', '')
  • 这似乎不太可能,因为您有 'b's 4th item',由于 'b' 被引用字符串,这将是一个语法错误。您实际上是在复制粘贴 echo 的输出,还是只是手动重新输入?
  • @wantTheBest 感谢您的发帖,请查看编辑后的答案
  • @Amber -- 这就是输出。我没有动机在这里伪装,因为很可能(客观地)很清楚我是来这里寻求帮助的。但也许我将查询字符串输出到浏览器的方式正在发挥作用? IDK,所以这是我的 调试输出代码,我从穴居人时代就开始使用 -- : echo ''
  • @wantTheBest 请以纯文本形式回显它
【解决方案3】:

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

表单的 input type="text" 字段被提交,当其中带有撇号的文本字符串然后在 PHP 中的服务器端从 $_POST 数组中提取出来并以方式显示时echo 中的斜杠 已经在文本字符串中,如下所示:

“这就是它的样子”

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

php_flag magic_quotes_gpc 关闭

因为 1and1 托管服务器显示错误(请参阅上面的我的 cmets)并且不会运行我的网站。

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

我已经测试了下面的代码并且它可以工作——在我的表单上,我输入字符串 "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

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

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

【讨论】:

  • 这就是为什么评论您的问题的人要求您发布当您在查询中不使用它的情况下回显该字符串时的样子。你回答说里面没有撇号。
  • 这个解决方案不是火箭科学。你可以在这里找到它php.net/manual/en/security.magicquotes.disabling.php
  • 正确的命令必须是 php_flag magic_quotes_gpc 0 我相信,而不是 off
  • 在此页面上:boutell.com/newfaq/creating/magicquotes.html 概述了一种无需将其关闭即可撤消魔术引号的方法。但是请注意,您应该真正使用 PDO 而不是 mysql_* 函数。
  • 是匿名的否定让我利用这个网站对我有利,而不是回馈任何东西。来吧,否定我到零。没有比 100% 抑制用户想要回馈的积极性更有效的方法来摩擦这个网站。我永远不会回答任何问题。您将不得不依靠您的“鲸鱼”来回答所有问题。这种“CURATION BY HUMILATION”的东西?哑的。 StackOverflow 现在的名声不好。直到我可以“阻止”隐藏在匿名背后并否认而不是试图提供帮助的匿名用户。
猜你喜欢
  • 2011-03-29
  • 2021-07-30
  • 2010-09-21
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多