【问题标题】:PHP sanitize user data for use in header() functionPHP 清理用户数据以在 header() 函数中使用
【发布时间】:2011-08-06 08:54:27
【问题描述】:

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

但是对于 PHP 的 header() 函数,需要做什么呢?有什么危险人物需要逃跑吗?

我正在尝试做这样的事情...将查询字符串附加到 header() 重定向到不同的页面

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

有人知道 header() 函数需要转义的内容吗?冒号和分号字符对于 header() 语句似乎总是很重要。我应该逃避那些吗?

【问题讨论】:

  • @Carlos: 自 PHP 5.1.2 起受核心保护(但值得注意)...
  • @ircmaxell 很高兴知道这一点:)

标签: php header http-headers sanitization


【解决方案1】:

不,只要您使用的是 PHP >= 4.4.2(如果在 PHP4 上)和 >= 5.1.2(如果是 PHP5),您无需采取任何措施来保护自己。

the docs for header()。具体来说:

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

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

另外,不要 urlencode 查询字符串。它将破坏正在发送的数据的语义。只需将其完整附加即可。

【讨论】:

  • 好消息!是的,我绝对应该先看一下,然后在 Q 中发布我的 php 版本。幸运的是,这个特定的服务器正在运行 php 5.2.11,因此希望能够覆盖。
  • 转义\r和\n:$text = str_replace("\r\n",'', $text);
【解决方案2】:

那里可能使用了一些漏洞,例如发送了多个标头,尽管事实上如果您运行的是 PHP5.1,PHP 会阻止这种情况,它会在此处报告它自己:

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

其中的一部分,如果您希望将查询字符串附加到该文件并且您没有使用 SEO url,您应该使用 urlencode() 验证查询字符串,这将检查字符串是否为查询字符串并将用适当的%+ 替换奇怪的字符或不允许的字符。

参考资料:

【讨论】:

    【解决方案3】:

    您也可以使用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
    

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 2014-10-10
      • 2013-12-08
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多