一尘不染

PHP mysql_real_escape_string()-> stripslashes()留下多个斜杠

php

我在使用PHP / MySQL转义/剥离字符串时遇到问题-似乎总是有多余的斜杠。


让我们以以下字符串为例:

<span style="text-decoration:underline;">underline</span>

当将字符串添加到数据库时,我将其转义,mysql_real_escape_string()并且以下内容存储在数据库中( EDIT
:通过直接使用mysql app查询数据库来检查此内容):

<span style=\\\"text-decoration:underline;\\\">underline</span>

当从数据库中读回时,我正在传递字符串,stripslashes()并返回以下内容:

<span style=\"text-decoration:underline;\">underline</span>

由于引号仍然被转义,因此它会中断html且文本不会带有下划线。


  1. 为什么要mysql_real_escape_string()添加三个斜杠并stripslashes()删除两个斜杠?我希望他们俩都添加/删除一个斜杠。
  2. 如何防止这种情况发生?
  3. 我是否采用正确的方法?

阅读 485

收藏
2020-05-29

共1个答案

一尘不染

最佳解决方案

在您的php.ini文件中,很可能magic_quotes_gpc指令被设置为on。出于安全原因,应禁用此功能。如果您无权访问php.ini文件(例如,在共享主机上),则始终可以使用.htaccess指令(假设这是apache服务器)完成相同操作。

在您的php.ini中

magic_quotes_gpc Off

在.htaccess文件中:

php_flag magic_quotes_gpc Off

为什么会这样呢?

发生这种情况的原因是由于以下逻辑过程。

  1. 需要转义的字符串发送到服务器。
    • This is my string. It's awesome.
  2. Magic Quotes在到达您的代码之前先将撇号转义。
    • This is my string. It\'s awesome
  3. mysql_real_escape_string现在有两个字符可以转义,即反斜杠\\和撇号\'
    • This is my string. It\\\'s awesome
  4. 此新的超级转义字符串存储在数据库中。
  5. 从数据库中检索到字符串后,会将其传递给stripslashes。这将删除在第3步中添加的两个转义符,但是由于其中一个反斜杠已被转义,因此stripslashes认为它属于该转义符。
    • This is my string. It\'s awesome

当您将这些字符串重新提交给数据库时,这个问题确实会失控,因为每次反斜杠数量都成倍增加。

替代解决方案

一种快速简便的替代方法是magic_quotes在将字符串传递到之前简单地删除通过添加的斜杠mysql_real_escape_string

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);
2020-05-29