为啥浏览器在通过来自不同域的发帖尝试 CSRF 攻击时不会引发 CORS 错误? [关闭]

Posted

技术标签:

【中文标题】为啥浏览器在通过来自不同域的发帖尝试 CSRF 攻击时不会引发 CORS 错误? [关闭]【英文标题】:Why does the browser not throw a CORS error when trying out CSRF attack by posting through a from from different domain? [closed]为什么浏览器在通过来自不同域的发帖尝试 CSRF 攻击时不会引发 CORS 错误? [关闭] 【发布时间】:2021-09-09 12:14:24 【问题描述】:

我正在尝试 Auth0 博客文章中的一些示例代码,Prevent Cross-Site Request Forgery (CSRF) Attacks。

正在设置两台服务器,一个位于localhost:3000 的易受攻击站点和位于localhost:4000 的攻击者站点。攻击者的站点使用隐藏表单向易受攻击的站点发出POST请求,易受攻击的站点接受攻击者的数据。

我检查了攻击者的 POST 请求,origin 和 referer 头都是localhost:4000。既然是向localhost:3000发出请求,为什么浏览器不抛出CORS错误呢? localhost:3000 服务器没有实现任何类型的 CORS 策略。

示例代码在 repo https://github.com/auth0-blog/csrf-sample-app.git.

【问题讨论】:

cors 不适用于 ,仅适用于 ajax 调用 另外,浏览器难道不会给localhost一些余地吗? 归根结底,localhost:3000 不是一个受浏览器保护的网站,它是一个服务器。它负责执行任何形式的跨域保护。 【参考方案1】:

CORS 的目的是not to increase security,但允许 种跨域通信。此代码中的方法(跨域表单发布)是一种类型的跨域请求,浏览器始终允许,并且明确排除了较新的 CORS 机制。

因为这种攻击一直都是可能的,所以网站一直需要 CSRF 保护来抵御它。我假设本文的作者专门选择了这种方法,以避免解释 CORS 协议带来的额外复杂性。

【讨论】:

以上是关于为啥浏览器在通过来自不同域的发帖尝试 CSRF 攻击时不会引发 CORS 错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

CSRF漏洞攻击原理及防御方案

跨站请求伪造(CSRF/XSRF)

Web安全相关:跨站请求伪造(CSRF/XSRF)

csrf攻击与防范

为啥恶意站点在攻击前无法通过 GET 获取 CSRF 令牌?

Django CSRF攻击