PHP mysql_real_escape_string() -> stripslashes() 留下多个斜杠最佳解决方案替代解决方案

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


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

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


向数据库添加字符串时,我用它来转义,以下内容存储在数据库中(编辑:通过使用mysql应用程序直接查询数据库来检查这一点):mysql_real_escape_string()

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


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

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


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


  1. 为什么要添加三个斜杠,而删除两个斜杠?我希望他们俩都添加/删除一个斜杠。mysql_real_escape_string()stripslashes()
  2. 如何防止这种情况发生?
  3. 我以正确的方式接近这一点吗?

答案 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. 从数据库中检索字符串时,会将其传递给 。这将删除步骤 3 中添加的两个转义,但由于其中一个反斜杠已被转义,因此认为它属于。stripslashesstripslashes
    • This is my string. It\'s awesome

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

替代解决方案

一种快速简便的替代方法是在将字符串传递给 之前简单地删除 添加的斜杠。magic_quotesmysql_real_escape_string

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

答案 2

向数据库中添加字符串时,我将用它来转义,以下内容存储在数据库中: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)

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


推荐