是否有任何需要对用户数据进行的转义例程才能在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()语句非常关键。我应该逃避吗?
答案 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