【问题标题】:Is this PHP redirect insecure?这个 PHP 重定向不安全吗?
【发布时间】:2011-02-06 21:14:19
【问题描述】:

嗯,我无法确定任何不安全感,但想知道您是否可以,如果可以,如何修补/修复?

代码如下:

header("Location: http://example.com/search/{$_POST['term']}/{$_POST['type']}");

我要重定向的网站也在他们这边进行验证和清理,但我担心的是 - 这种重定向是否以任何方式不安全(在我这边 - 看到我正在使用直接@987654322 @'s)。

感谢所有帮助。

PS:我只是好奇,因为我一直认为使用未经处理的用户输入是危险的(或至少适用于 XSS 和 SQLi)。

【问题讨论】:

  • 孤立地查看,我没有看到任何安全问题。假设您拥有域 A,并且将用户重定向到您无法控制的域 B,这本身应该没有问题。
  • 安全胜于遗憾:urlencode() 打字不多。
  • 是的,因为 POST 值将来自前端(由最终用户操作),这意味着最终用户可以向其附加命令。所以,在我看来,这应该在它得到这个声明之前进行消毒。

标签: php header


【解决方案1】:

总的来说,对于大多数运行现代版本 PHP 的网站来说,它是安全的

手头有两个问题:

  • 恶意用户可能会诱使受害者无意中访问网站上任何形式为/search/*/* 的页面,方法是将其链接到一个恶意页面,该页面通过您的重定向发布到该页面。 (请注意,它们不仅限于/search 之后的两个斜杠,因为它们的 POST 变量可能包含斜杠。)这类似于将重定向他们的缩短的 bit.ly URL 交给某人,所以还不错。
  • HTTP response splitting。如果恶意用户在其 POST 数据中包含换行符(特别是 CRLF / \r\n),他们可能会导致您的 header() 调用输出多个标头,包括设置 cookie 的标头等。但是,从 PHP 5.1.2 开始this has been fixed

【讨论】:

    【解决方案2】:

    这不是安全问题,但您可能应该使用urlencode($_POST['term']) 对这些参数进行 URL 编码。

    【讨论】:

    • 这是一个很好的修复。我可能会使用rawurlencode,它明确表示“用于保护文字字符不被解释为特殊的 URL 分隔符。”
    【解决方案3】:

    是的,这很不安全。永远不要将未经检查的用户输入放入脚本中。我建议至少在对它进行任何操作之前使用filter_input_array 清理您的 $_POST 数组。

    【讨论】:

    • 你能澄清一下吗?可能会出现哪些安全问题?
    • 这是目标 URL 上的 XSS 暴力破解漏洞。我知道这里似乎没有问题,但我看到白帽程序员通过构造的 URL 获得对我客户服务器的 root 访问权限,这些 URL 允许在他们的构造中未经检查的用户输入。
    • @Brian 你能详细说明一下吗?并且 filter_input_array 有各种过滤器 - 所以我有点困惑哪个是合适的(由于我对确切漏洞的理解)。
    • @Brian 但该攻击是第 3 方站点上的漏洞,不是由上述代码中的漏洞引起的。
    • @Hamish 所以我猜 OP 没有责任试图保护第三方网站免受攻击?提醒我永远不要让你重定向到我的网站。
    【解决方案4】:

    希望从客户端接收重定向 URL 的 Web 层将对整个 URL 执行验证,因此您可能是安全的。但是在发送重定向之前通过简单的验证运行这两个字段并没有什么坏处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 2015-06-04
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多