“在每个引用之前削减”问题

时间:2010-06-09 13:47:47

标签: php mysql html security

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

有时候这个页面会被提交给自己(就像上传图片一样)。

我不希望用户必须反复填写每个字段,因此我将其用作表单内文本输入的值:

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

这是有效的,除了它在每个双引号之前添加“\”符号...

例如,编写19“轮后,页面提交给自己:

  19\" wheels

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

这里有什么问题?

更新

好的,所以问题是magic_quotes ...这是在我的服务器上启用的......

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

什么是禁用它的伤害?

6 个答案:

答案 0 :(得分:24)

您似乎已启用 magic quotes 。使用 stripslashes 以下条件使用您要处理的任何文字:

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

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

<强>更新

魔术引号 exaplained here 。对于编写良好的代码,禁用它通常没有任何害处。

答案 1 :(得分:4)

您可能已启用magic quotes。你也需要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源代码中,您只是看不到它。做查看来源;)


根据您的更新

更新magic quotes用于阻止初学者代码中的SQL injection attacks。您经常在第三方主机中看到这一点。如果您真的知道您在代码中正在做什么,那么您可以安全地将其关闭。但是如果你想让你的代码可以分发,那么在收集请求参数时你会真正考虑到这一点。为此,上述函数示例非常适合(您只需要自己编写simliar get_boolean()get_number()get_array()函数。)

答案 2 :(得分: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

希望这有助于清理事情。

答案 3 :(得分: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;
?>

答案 4 :(得分:1)

您的服务器似乎设置为使用Magic Quotes

您可以使用stripslashes或更好的turning off Magic Quotes剥离它们来修复它。

答案 5 :(得分:0)

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