HTTP_ORIGIN
是一种预防方法CSRF(跨站请求伪造)请求。目前它仅由 Chrome 实现(截至 2011 年 11 月)。我测试了 Firefox 和 Opera,但都失败了。
它在请求头中的名称是Origin
。在我的 PHP 脚本的服务器上,我将其视为HTTP_ORIGIN
in the $_SERVER
大批。仅在某些情况下,当需要针对 CSRF 的保护时才发送此标头(仅 POST 就足够了)。以下是所有请求的列表,无论是否设置:
https://wiki.mozilla.org/Security/Origin https://wiki.mozilla.org/Security/Origin
- 锚标记 - 否
- 窗口导航 - 否
- IMG - NO
- iframe、嵌入、小程序 - 是
- 表单(GET 和 POST)- 是
- 脚本 - 是
- 样式表 - 否
- 来自样式表的相关负载 - 否
- 重定向 - 是
- XHR-是
The Origin
不幸的是, header 仅在 Chrome 中实现。它于 2010 年 1 月在 Google Chrome 博客上首次宣布:
http://blog.chromium.org/2010/01/security-in-deep-new-security-features.html http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
通过 Origin 标头进行 CSRF 保护
Origin 标头是一项新的 HTML5 功能,可帮助您保护网站免受跨站请求伪造 (CSRF) 攻击。在 CSRF 攻击中,恶意网站(例如attacker.com)指示用户的浏览器向目标服务器(例如example.com)发送HTTP 请求,从而迷惑example.com 服务器执行某些操作。例如,如果 example.com 是网络邮件提供商,则 CSRF 攻击可能会诱骗 example.com 将电子邮件转发给攻击者。
Origin 标头通过识别哪个网站生成请求来帮助网站防御 CSRF 攻击。在上面的示例中,example.com 可以看到请求来自恶意网站,因为 Origin 标头包含值http://attacker.com http://attacker.com。要将 Origin 标头用作 CSRF 防御,站点应仅在响应 (1) 缺少 Origin 标头或 (2) 具有带有白名单值的 Origin 标头的请求时修改状态。
我只是在我的 PHP 脚本中实现 CSRF 保护,我个人使用 Chrome,所以这对我来说已经足够了,我希望其他浏览器很快就能赶上 Chrome。
有趣的是 Mozilla 发明了该安全功能,因为您可以阅读大量相关文档Origin
其网站上有标题,但他们仍然没有时间实现它;-)
HTTP_ORIGIN
似乎只包含protocol
and domain
,末尾不带斜杠:
“http://www.example.com” - 即使您从“http://www.example.com/myform/”提交表单。
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 以外的端口(Origin 包含不同于 80 的端口)、HTTPS 连接以及从不同子域提交表单(例如 sub.example.com => 将请求发布到www.example.com http://www.example.com).