我很久以前就听说过CSRF ,我听到的最多的是:
防止 CSRF 攻击很重要,这样某人就不会自动提交您的表单(使用机器人或其他东西)
嗯,这不是 100% 正确的,是吗?
我已经做了大约 3 年的网络抓取,发出请求、解析csrftokenmiddleware
字段并将其与其他字段一起发布非常简单。
那么,它的真正用途是什么?
我很久以前就听说过CSRF ,我听到的最多的是:
防止 CSRF 攻击很重要,这样某人就不会自动提交您的表单(使用机器人或其他东西)
嗯,这不是 100% 正确的,是吗?
我已经做了大约 3 年的网络抓取,发出请求、解析csrftokenmiddleware
字段并将其与其他字段一起发布非常简单。
那么,它的真正用途是什么?
想象一个电子银行 Web 应用程序,banking.example.com
使用以下表单提交交易:
<form action="/transaction" method="post">
<input type="text" name="beneficiary"/>
<input type="text" name="amount"/>
<input type="submit" value="Pay"/>
</form>
攻击者现在可以使用以下内容设置网站hacker.net
:
<form action="https://banking.example.com/transaction" method="post" style="visibility:hidden">
<input type="text" name="beneficiary" value="John Doe, Account No. 34-236326-1"/>
<input type="text" name="amount" value="1000000"/>
<input type="submit" value="Pay"/>
</form>
<script>
document.forms[0].submit();
</script>
然后攻击者会诱骗受害者访问hacker.net
,这将导致受害者的浏览器向电子银行应用程序发送 POST 请求,从而向黑客进行大笔交易。这是因为受害者的浏览器很乐意将会话 cookie 连同伪造的 POST 请求一起发送到电子银行应用程序。如果表单受到 CSRF 令牌的保护,那么攻击者就无法使受害者的浏览器发送有效的 POST 请求,因此攻击是不可能的。
这种类型的攻击称为跨站点请求伪造 (CSRF) 攻击。
顺便说一句,CSRF 攻击也是人们建议在登录电子银行或其他关键 Web 应用程序时永远不要访问其他网站的原因。
CSRF 令牌不保护由常规授权用户作为他们自己自动提交的 Web 表单。为了避免这种情况,您可以使用CAPTCHA。
是的,您可以抓取表单并获取 CSRF 预防令牌。但是你不能在不抓取网站的情况下提交表单,并且你不能从其他人那里获得令牌然后提交表单——它链接到一个会话。这就是 CSRF 保护真正防止的,有人欺骗用户提交表单。
对 CSRF 的更一般描述,最初是为了响应Django 的评论框架和 CSRF 而发布的:
CSRF 是一种攻击,其中未经许可访问资源的人欺骗有权访问资源的人。
因此,例如,CSRF 保护可以防止有人欺骗用户发布带有垃圾邮件或恶意软件链接的评论。或者,他们诱骗用户提出的请求可能格式不正确,导致您的网络服务器崩溃,或者包含旨在通过验证过程并导致数据库损坏或以其他方式损害您的网站的代码。
因此,如果没有 CSRF 保护,理论上有人可以欺骗登录用户提交他们实际上没有写的评论。
使用 CSRF 保护,Django 将检测到它不是通过您网站上的实际表单提交的真实数据,并将拒绝它。
这是对不同类型场景的保护。有时,攻击者能够将 javascript、iframe 或 img src-s 注入您的页面,任何登录用户都可以访问的地方。当用户访问该页面时(假设一个带有评论的页面,并且一个评论请求攻击者发布的链接),该请求是由登录用户的浏览器连同他的 cookie 一起发出的。CSRF 基本上保护了这种触发提交(简单的客户端提交)。当然,任何攻击者都可以请求页面,将其解析为令牌并使用令牌创建请求,但不能在登录用户之外执行此操作。
你将无法
要发出请求,请解析 csrftokenmiddleware 字段并将其与其他字段一起发布。
因为如果您的服务器配置正确,不同域上的 JS 将无法从您的域中获取和使用数据来构造请求 。
阅读有关CORS的信息。