18

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


我们以下面的字符串为例:

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


将字符串添加到数据库时,我将其转义,mysql_real_escape_string()并将以下内容存储在数据库中(编辑:通过直接使用 mysql 应用程序查询数据库进行检查):

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


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

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


由于引号仍然被转义,它破坏了 html 并且文本没有下划线。


  1. 为什么要mysql_real_escape_string()加三个斜线,stripslashes()去掉两个斜线?我希望他们都添加/删除一个斜线。
  2. 我怎样才能防止这种情况发生?
  3. 我以正确的方式接近这个吗?
4

3 回答 3

83

最佳解决方案

在您的 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);
于 2009-10-05T20:54:19.163 回答
3

将字符串添加到数据库时,我将其转义,mysql_real_escape_string()并将以下内容存储在数据库中:

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

不,这不对。当您在 sql 查询中转义字符串时,它只是为了传输查询中的数据。数据库解析查询并将数据存储在数据库中,没有任何额外的斜线。因此,当您从数据库中检索数据时,您不应该任何内容进行转义。这是一个常见的误解。

如果你发现输出中有多余的斜线,你可能打开了魔术引号。把它们关掉

编辑:

mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar                                                         |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> | 
+-------------------------------------------------------------+
1 row in set (0.00 sec)

如您所见,查询比数据库中出现的数据多一级转义,因此查询时它是如何出现的。在您的情况下,可能发生的事情是您打开了魔术引号,然后在将字符串嵌入查询之前对其进行转义。这会导致双重转义,篡改您的数据。正确的解决方案是像您一样继续转义字符串,但关闭魔术引号。并且不要对来自数据库的数据做任何事情。请注意,需要先清理系统中已有的数据。

于 2009-10-05T21:11:44.350 回答
1

如果get_magic_quotes_gpc()在 SERVER 中关闭,那么只有我们可以使用

$data= mysql_real_escape_string($_POST['data']);

如果get_magic_quotes_gpc()在服务器中打开,我们必须使用

$data= mysql_real_escape_string(stripslashes($_POST['data']));

否则在您的数据中添加两个反斜杠。

另外另一个解决方案是stripslashes($data),如果我们只使用使用,我们可以在从 datadase 获取时使用mysql_real_escape_string($_POST['data']);

于 2013-02-06T07:05:58.093 回答