PHP清理用户数据以在header()函数中使用

时间:2011-04-15 13:48:18

标签: php header http-headers sanitization

是否有任何需要对用户数据进行的转义例程才能在PHP的header()函数中使用?
例如,对于MySQL,我在将数据发送到数据库之前对用户数据运行mysql_real_escape_string(),并在HTML中输出我运行htmlspecialchars()...这两者都包含在我自己的自定义函数中,以便先进行其他处理。

但是对于PHP的header()函数,需要做什么?我有什么危险的角色可以逃脱吗?

我正在尝试这样做...将查询字符串附加到标题()重定向到其他页面

if ( strlen($_SERVER['QUERY_STRING']) > 0) {
$query_string = '?'.$_SERVER['QUERY_STRING'];
}
header('Location: http://domain.com/activate.php'.$query_string);
exit();

任何人都获得了有关header()函数需要转义的内容的任何信息?冒号和分号字符似乎对header()语句非常关键。我应该逃避吗?

3 个答案:

答案 0 :(得分:19)

不,只要您使用PHP> = 4.4.2(如果在PHP4上)和> = 5.1.2(如果是PHP5),您就无需保护自己。

the docs for header()。具体做法是:

  

此函数现在可以防止一次发送多个标头,以防止标头注入攻击。

因此,没有必要为位置标题转义任何。如果您使用的是早期版本,则需要转义所有\r\n个字符(以防止标头注入)。

此外, urlencode查询字符串。它将打破正在发送的数据的语义含义。只需将其全部附加。

答案 1 :(得分:1)

可能会有一些漏洞使用,比如发送了多个标头,尽管事实上如果你运行的是PHP5.1,这可以通过PHP来防止它自我报告:

  

4.4.2和5.1.2:此函数现在可以防止一次发送多个标头,以防止标头注入攻击。

从中可以看出,如果您希望查询字符串附加到该文件而您没有使用SEO网址,则应使用urlencode()验证查询字符串,这将检查字符串是否为查询字符串是否将使用适当的%+替换奇怪的字符或不允许的字符。

参考文献:

答案 2 :(得分:1)

您还可以使用http_build_query将关联的数组转换为查询字符串。

<?php
    $data = array('foo'=>'bar',
          'baz'=>'boom',
          'cow'=>'milk',
          'php'=>'hypertext processor');

    echo http_build_query($data) . "\n";
?>

以上示例将输出:

foo=bar&baz=boom&cow=milk&php=hypertext+processor