php 的字符加倍(这破坏了 mysql_real_escape_string、PDO->quote 等)

标签 php mysql pdo

所以最近在我的一个项目中,PHP 在处理字符串中的 ' 字符时遇到了很多麻烦,我认为这背后的主要原因是由于某种疯狂的原因,它将\字符加倍。我检查过,魔术引号已关闭(所以这不是罪魁祸首)。无论如何,给出以下代码:

26 $comments = $_POST['comments'];
27 error_log("comments: '$comments'");
28 $comments = mysql_real_escape_string($_POST['comments']);
29 error_log("escaped comments: '$comments'");

我在错误日志中看到以下内容:

[Sun Oct 19 14:18:53 2014] [error] [client XXXX] comments: 'something elsewearwerawer's woeimrowiamrw', referer: ...
[Sun Oct 19 14:18:53 2014] [error] [client XXXX] comments escaped: 'something elsewearwerawer\\'s woeimrowiamrw', referer: ...

更糟糕的是,在将内容交换到 PDO 后我仍然看到相同的行为:

error_log("quoted: '" . $db_pdo->quote($comments) . "'");

即使我做了一些简单的事情,例如:

error_log('\\');

error_log("\\");

错误日志显示:

[Sun Oct 19 17:44:57 2014] [error] [client XXXX] \\, referer: ...

知道这是怎么回事吗?我很担心,因为看起来这意味着 mysql_real_escape_string (或 PDO)没有正确转义字符串中的单引号,这可能导致 SQL 注入(inject)。每当我尝试更新/插入带有 ' 的字符串时,即使在调用 mysql_real_escape_string 或使用 quote (或带有字符串的 bindParam)之后,它也不会在 ' 之后插入任何内容

已解决:深入挖掘后,它实际上是正确地将内容插入数据库,当网页从数据库中提取数据并且未正确处理 ' 时,错误发生在事物的另一端,因此它在 html 中被截断。

最佳答案

您的转义实际上看起来很正常,只是看起来发生了双重转义,因为 Apache 在其日志中转义了反斜杠,如所述 here 。因此,当您在日志中看到 \\' 时,它实际上只是 PHP 字符串中的 \' 。如果您想对此进行测试,请echo转义字符串,而不是使用error_log

关于php 的字符加倍(这破坏了 mysql_real_escape_string、PDO->quote 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456273/

相关文章:

PHP PDO 准备和执行语句

php - 人们注册时如何防止重复的用户名?

php - Zend Framework, HelperBroker PHP单元测试

php - `pg_query_params` 和参数太多

php - MySQL/PHP 按位置排序

mysql - 导入数据库后表不显示表关系

mysql - 更新中间位被零屏蔽的列

php - 使用 fgetcsv 读取 CSV 文件时出现 UTF-8 问题

mysql - 服务器退出而不更新 PID 文件 - Ubuntu 12.04 服务器

php - 已经有一个活跃的交易