是否有可能在 CORS 之前进行 CSRF 攻击?

Posted

技术标签:

【中文标题】是否有可能在 CORS 之前进行 CSRF 攻击?【英文标题】:Was it possible to do CSRF attacks before CORS? 【发布时间】:2019-01-16 20:13:56 【问题描述】:

我查看了 this 堆栈溢出答案以了解 CORS 预检请求。根据这个答案,当 CORS 不存在时,可以进行 CSRF 攻击。

但是查看“简单”请求的要求 需要预检,我看到仍然允许 POST。那可以改变 像 DELETE 一样声明和删除数据!

这是真的! CORS 不会保护您的站点免受 CSRF 攻击。然后 同样,如果没有 CORS,您也无法免受 CSRF 攻击。这 预检请求的目的只是限制您的 CSRF 暴露于 在 CORS 之前的世界中已经存在的东西。

但是,如果浏览器遵循Same Origin Policy,我想不出 CSRF 攻击的可能性。如果恶意站点试图访问另一个站点,浏览器会简单地阻止它,因为请求的来源不同。

如果没有 CORS,有人可以解释 CSRF 攻击是如何发生的吗?

【问题讨论】:

【参考方案1】:

同源适用于 AJAX 请求之类的东西,但这不是触发 CSRF 攻击的唯一方式。

举个例子:

<form id="evilForm" method="post" action="http://example.com/delete_user.php">
    <input type="hidden" name="user_id" value="12345">
</form>

<script>
document.getElementById('evilForm').submit();
</script>

【讨论】:

感谢您的回答。您能否解释一下为什么同源策略仅适用于 AJAX 请求,而攻击者可以轻松地执行您的示例中的操作?我最初的理解是,防止 CSRF 有相同的来源政策。 同源策略更关心客户端能够读取响应,而不是发出请求。对于&lt;form&gt; 帖子,任何客户端都不会读取响应。

以上是关于是否有可能在 CORS 之前进行 CSRF 攻击?的主要内容,如果未能解决你的问题,请参考以下文章

为啥预检 CORS 不阻止 CSRF 攻击?

CSRF利用总结(CORS,Josnp)

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

CORS 和 CSRF 处理 checkMarx XSRF 攻击问题(spring boot 微服务)

同源策略的解决方案

过于宽松的 CORS 设置会导致 CSRF 吗?