HTTP_ORIGIN的安全性如何?

2022-08-30 11:45:37

我想了解来自第三方网站的传入HTTP_REQUEST呼叫是否来自我定义的域列表。

我知道HTTP_REFERER可以用来找出第三方域名的位置,但它不够安全。人们可以欺骗它或使用Telnet来伪造它。

那么,HTTP_ORIGIN呢?它是从所有浏览器发送的吗?它安全吗?

此外,人们可以在HTTP_REQUEST电话中伪造REMOTE_ADDR吗?


答案 1

HTTP_ORIGIN是一种防止 CSRF(跨站点请求伪造)请求的方法。目前,它仅由Chrome实现(截至2011年11月)。我测试了Firefox和Opera,但它们失败了。

它在请求标头中的名称是 。在我的PHP脚本的服务器上,我看到它就像在数组中一样。仅当需要针对 CSRF 的保护时,才会在某些情况下发送此标头(只有 POST 应该足够)。以下是所有请求的列表,无论它是否设置:OriginHTTP_ORIGIN$_SERVER

https://wiki.mozilla.org/Security/Origin

  • 锚点标签 - 否
  • 窗口导航 - 否
  • IMG - 否
  • iframe, embed, applet - YES
  • 表单(获取和发布) - 是
  • 脚本 - 是
  • 样式表 - 否
  • 来自样式表的相关载荷 - NO
  • 重定向 - 是
  • XHR - 是

不幸的是,该标头仅在Chrome中实现。它于2010年1月在Google Chrome的博客上首次宣布:Origin

http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html

通过源头进行 CSRF 保护

Origin 标头是一项新的 HTML5 功能,可帮助您保护站点免受跨站点请求伪造 (CSRF) 攻击。在CSRF攻击中,恶意网站(例如 attacker.com)指示用户的浏览器向目标服务器(例如 example.com)发送HTTP请求,从而使 example.com 服务器混淆以执行某些操作。例如,如果 example.com 是 Web 邮件提供商,则 CSRF 攻击可能会诱使 example.com 将电子邮件转发给攻击者。

Origin 标头通过识别哪个网站生成了请求,帮助站点抵御 CSRF 攻击。在上面的示例中,example.com 可以看到请求来自恶意网站,因为 Origin 标头包含值 http://attacker.com。要将 Origin 标头用作 CSRF 防御,站点应仅在响应 (1) 缺少 Origin 标头或 (2) 具有具有白名单值的 Origin 标头的请求时修改状态。

我只是在我的PHP脚本中实现CSRF保护,我个人使用Chrome,所以这对我来说已经足够了,我希望其他浏览器能很快赶上Chrome。

有趣的是,Mozilla发明了该安全功能,因为您可以在其网站上阅读该标头的大量文档,但他们仍然没有时间实现它;-)Origin

HTTP_ORIGIN似乎只包含 和 ,末尾没有斜杠:“http://www.example.com” - 即使您从“http://www.example.com/myform/”提交表单。protocoldomain

PHP 脚本中针对 CSRF 的简单保护:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        $address = 'http://'.$_SERVER['SERVER_NAME'];
        if (strpos($address, $_SERVER['HTTP_ORIGIN']) !== 0) {
            exit('CSRF protection in POST request: detected invalid Origin header: '.$_SERVER['HTTP_ORIGIN']);
        }
    }
}

此脚本仍可升级为支持 80 以外的端口(当源包含与 80 不同的端口时,源包含端口)、HTTPS 连接以及从不同子域提交表单(例如 sub.example.com = > 向 www.example.com 发布请求)。


答案 2

HTTP_ORIGIN既不是由所有浏览器发送的,也不安全。

浏览器发送的任何内容都不能被认为是安全的。


推荐