每个引号之前都需要加上斜杠的问题

17

我有一个包含表单的 PHP 页面。

有时,这个页面会被提交到自身(例如上传图片时)。

我不希望用户需要一遍又一遍地填写每个字段,因此我将以下内容作为文本输入框的值放在表单中:

value="<?php echo htmlentities(@$_POST['annonsera_headline'],ENT_COMPAT,'UTF-8');?>">

这个方法是可行的,但它在每个双引号前面添加了一个 "\" 符号...

例如,输入 19" 轮毂,提交表单后会变成:

  19\" wheels

如果我甚至不使用htmlentities,那么引号后面的所有内容都会消失。

问题出在哪里?

更新:

好吧,问题是魔术引号...这在我的服务器上启用了...

我应该禁用它吗?我有root访问权限并且这是我的服务器 :)

禁用它有什么危害?


get_magic_quotes_gpc()的输出是什么? - Wrikken
2
禁用它的危害:如果你正确编程,那么没有危害。保持它的危害:你倾向于依赖它被激活并打开可怕的安全漏洞,如果你因某种原因禁用它或将你的脚本复制到没有它的机器上。正确的意思是:每个输出都通过htmlentities运行,每个数据库输入使用参数(最佳)或正确转义(可接受,但有时可能会忘记)。 - user253984
6个回答

24

看起来你开启了魔术引号。使用下面的条件和想要处理的文本一起使用stripslashes函数:

if(get_magic_quotes_gpc())
{
   $your_text = stripslashes($your_text);
}

现在你可以正常处理$your_text变量了。

更新:

魔术引号在这里解释。对于编写良好的代码,通常禁用它不会有任何危害。


4
您可能已经开启了魔术引号。您还需要stripslashes()对其进行处理。
最好的方式是将此内容封装在一个函数中:
function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

你可以用作

$annonsera_headline = get_string($_POST, 'annonsera_headline');

顺便说一下:

如果我甚至不使用htmlentities,那么引号后面的所有内容都会消失。

实际上,在HTML源代码中仍然存在,只是你看不到它。请查看源代码;)


根据您的更新: 魔法引号 用于防止初学者代码中的 SQL注入 攻击。在第三方主机中经常出现这种情况。如果您在代码中确实知道自己在做什么,那么可以安全地关闭它。但是,如果您想使您的代码可分发,则需要在收集请求参数时特别注意此事。为此,上述函数示例非常适合(您只需要编写类似的get_boolean()get_number()get_array()函数即可)。

2
这实际上是 PHP 的一项功能,旨在提高安全性(trying to be security conscious),幸运的是,有一个简单的修复方法,大致如下:
if (get_magic_quotes_gpc()) {$var = stripslashes($var);}

“启用它并没有什么大问题,这取决于个人喜好。如果你的代码需要经常迁移服务器,并且无法通过php.ini文件禁用它,最好使用上述描述的方法。
如果你可以访问php.ini文件并想要更改它,因为你不想每次都验证它,可以将以下行添加到php.ini中。”
magic_quotes_gpc = Off

将以下内容添加到您的 .htaccess 文件中:
php_flag magic_quotes_gpc Off

希望这有助于澄清事情。

2

如果可以的话,您应该禁用魔术引号。这个功能已经被弃用了,并且将来很可能完全消失。

如果您依赖于魔术引号来转义数据(例如在将其插入数据库时),如果禁用它,您可能会面临 SQL 注入漏洞。您应该检查所有查询并确保您正在使用 mysql_real_escape_string()

我在应用程序中包含以下文件,以撤消部署到我无法控制的服务器上的魔术引号。

<?php
set_magic_quotes_runtime(0);

function _remove_magic_quotes(&$input) {
    if(is_array($input)) {
        foreach(array_keys($input) as $key) _remove_magic_quotes($input[$key]);
    }
    else $input = stripslashes($input);
}
if(get_magic_quotes_gpc()) {
    _remove_magic_quotes($_REQUEST);
    _remove_magic_quotes($_GET);
    _remove_magic_quotes($_POST);
    _remove_magic_quotes($_COOKIE);
}

return true;
?>

1

根据我的第二句话 - 关闭魔术引号!它们是邪恶的。 - Dominic Rodger
不那么邪恶。只是在你的数据中撒点垃圾。 - Your Common Sense

0
  1. 在将内容写入输入字段值时,不应使用htmlentities()。
  2. 您的服务器是否启用了magic_quotes?尝试在输出之前使用stripslashes。

@oezi htmlentities() 函数有什么问题吗? - Your Common Sense
这是一个输入字段的值。如果在此情况下使用htmlentities,你会看到像&或ä之类的东西,这不是它应该有的样子!从输入值中不可能发生XSS攻击。感谢毫无意义的负评... - oezi
1
对于文本字段数据,我使用以下函数:function dequote($instr) { return str_replace("'", '&#39;', str_replace('"', '&#34;', $instr)); } - Rob
$var='Bill "buffalo" Tuckson'; <input type="<?php echo $var?>"> 你会在输入框中看到什么? - Your Common Sense
@Rob别傻了,使用htmlspecialchars() - Your Common Sense
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接