发送引荐来源 HTTP 标头如何防止 CSRF 攻击?

信息安全 csrf 火狐 用户跟踪 推荐人 标题
2021-08-18 08:20:21

发送引荐来源 HTTP 标头如何防止 CSRF 攻击?

我尝试使用 Firefox 的network.http.sendRefererHeader设置为 0(即完全禁用,作为防止跟踪的措施)登录 HTTPS 站点,它说:

禁止 (403)

CSRF 验证失败。请求中止。

您看到此消息是因为此 HTTPS 站点要求您的 Web 浏览器发送“Referer 标头”,但未发送任何内容。出于安全原因,此标头是必需的,以确保您的浏览器不被第三方劫持。

如果您已将浏览器配置为禁用“Referer”标头,请重新启用它们,至少对于此站点、HTTPS 连接或“同源”请求。

这将如何防止 CRSF 攻击?难道攻击者不能只是欺骗引荐来源标头,让它看起来像我会发送的吗?

2个回答

要理解这一点,首先需要了解什么是跨站点请求伪造。

跨站点请求伪造是指攻击者在他们控制的网站上拥有一些脚本或嵌入式媒体,这使得该网站的任何访问者都请求来自不同站点的资源。该请求在用户的上下文中显示给该其他站点。例如,我可以将带有 url 的图像添加https://othersite.example.com/delete_my_account.php?really=true到我的网站。当您访问我的网站并且当前登录到您的帐户时othersite.example.com,您的浏览器将请求该 URL,这将导致othersite.example.com您的帐户被删除。

但是有一个问题:当othersite.example.com可以读取您的引荐来源网址时,它可以看到此请求是由与不同站点交互的人引起的。没有充分的理由让网站具有指向执行操作的 URL 的深层链接。当另一个站点拒绝没有引荐来源的请求时,这种攻击就变得不可能了。

关于引用者欺骗:请记住,发出请求的客户端不是攻击者。攻击者是网站运营商。运营商可以做的最糟糕的事情是让您的网络浏览器在其网站的上下文中执行 Javascript。虽然有多种方法可以使用 Javascript 向其他网站发出请求,但这些 API 都不允许伪造引荐来源网址。

攻击者不能只是欺骗引荐来源网址吗

不,他们不能。

根据文档,在提交表单(或各种 GET 方法,如图像标签或 CSS 中的 url)时显然是不可能的,并且通过 XMLHttpRequest 也不可能

话虽如此,我建议改用令牌,因为如果存在开放式重定向漏洞并且应用程序不遵循 restful,或者如果它允许降级到 GET 并包含开放式重定向漏洞、HTML 注入漏洞,则可能会绕过检查引用者,或 CSS 注入漏洞。它也可能导致可用性问题(如您的情况)。