转义单引号时,PHP Addslashes添加双反斜杠

时间:2009-04-02 03:55:26

标签: php

Addslashes似乎有点困惑。给出以下2行代码

$name = "Dave's test";
$newName = addslashes($name);

期待 $ newName “Dave的测试”(我的单引号很好地逃脱了)

然而,我获取的是“Dave \\的测试”(请注意DOUBLE反斜杠)。这与我在addslashes上找到的每一个在线文档相矛盾 - 并且让我感到非常悲痛。

我将通过error_log ...

将addslashes结果转储到http错误日志之前和之后
error_log("before=$name  after=$newName");

结果...

before=Dave's test  after=Dave\\'s test

注意 - 这是ajax过程的一部分,所以我无法真正“回应”结果。

非常感谢任何关于为什么addlashes会在后退上加倍的见解。

仅供参考:我在linux下使用PHP 5.2.6并使用魔术引号OFF。

7 个答案:

答案 0 :(得分:4)

看起来error_log在内部调用addslashes。在阅读了回复我原来问题的帖子后,我创建了一个非常简单的脚本......

<?php
        $name = "Dave's test";
        $newName = addslashes($name);
        echo    "name=$name.   newName=$newName";
        error_log("name=$name.   newName=$newName");
?>

echo的结果:

name=Dave's test. newName=Dave\'s test

error_log的结果:

name=Dave's test.   newName=Dave\\'s test

非常感谢所有花时间阅读和评论这个问题的人。这是我关于Stack Overflow的第一个问题,我只是被响应的速度所震惊。多么棒的社区!

答案 1 :(得分:1)

对于初学者,你为什么要逃脱addslashes()?这是一种不充分的方法,特别是如果你试图防止SQL注入。

您还能告诉我们您的配置,以便我们尝试复制吗?

答案 2 :(得分:1)

您可以在php.ini文件中将magic_quotes_gpc设置为Off。这将阻止你的双重逃避。请记住要谨慎行事,就好像你正在使用SQL一样,你可以轻松地进行一些SQL注入。

答案 3 :(得分:0)

我的猜测是error_log()功能正在使用另一个反斜杠转义反斜杠本身。

然后表示的字符串在技术上只有1个反斜杠,这是期望的结果。

试试这个简单的测试:

error_log('\a')

并查看您是否在日志中获得\\a

答案 4 :(得分:0)

无法在5.2.6或5.2.0安装上进行复制。

如果您在编写的操作后立即回显$ newName ,您是否看到了双反斜杠?我问,因为我怀疑其他处理层的干预是反斜杠加倍,而不是addslashes()。

答案 5 :(得分:0)

  

注意 - 这是ajax过程的一部分,所以我无法真正“回应”结果。

我认为这可能是问题的关键 - 我认为addslashes可能正确地为该引用添加了一个反斜杠,但不知何故,你的AJAX进程再次逃避它。你是通过JSON传递这个文本(使用json_encode)?如果是这样,你不需要转义它,因为json_encode()将透明地执行它。

如果您无法“回显”结果,或者将其写入文件?

$name = "Dave's test";
$newName = addslashes($name);
file_put_contents('/tmp/test.txt', $newName); // temporary

这至少可以让你向自己证明你的addslashes()正在做它应该做的事情。

答案 6 :(得分:0)

我建议您使用 sprintf 格式化字符串,addslashes可以使用斜杠留下您的日志,而您只想格式化字符串。