HTTP_ORIGIN的安全性如何?
我想了解来自第三方网站的传入HTTP_REQUEST呼叫是否来自我定义的域列表。
我知道HTTP_REFERER可以用来找出第三方域名的位置,但它不够安全。人们可以欺骗它或使用Telnet来伪造它。
那么,HTTP_ORIGIN呢?它是从所有浏览器发送的吗?它安全吗?
此外,人们可以在HTTP_REQUEST电话中伪造REMOTE_ADDR吗?
我想了解来自第三方网站的传入HTTP_REQUEST呼叫是否来自我定义的域列表。
我知道HTTP_REFERER可以用来找出第三方域名的位置,但它不够安全。人们可以欺骗它或使用Telnet来伪造它。
那么,HTTP_ORIGIN呢?它是从所有浏览器发送的吗?它安全吗?
此外,人们可以在HTTP_REQUEST电话中伪造REMOTE_ADDR吗?
HTTP_ORIGIN
是一种防止 CSRF(跨站点请求伪造)请求的方法。目前,它仅由Chrome实现(截至2011年11月)。我测试了Firefox和Opera,但它们失败了。
它在请求标头中的名称是 。在我的PHP脚本的服务器上,我看到它就像在数组中一样。仅当需要针对 CSRF 的保护时,才会在某些情况下发送此标头(只有 POST 应该足够)。以下是所有请求的列表,无论它是否设置:Origin
HTTP_ORIGIN
$_SERVER
https://wiki.mozilla.org/Security/Origin
不幸的是,该标头仅在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/”提交表单。protocol
domain
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 发布请求)。
HTTP_ORIGIN
既不是由所有浏览器发送的,也不安全。
浏览器发送的任何内容都不能被认为是安全的。