什么是CSRF保护?

Osc*_*ros 12 security django csrf django-csrf

我很久以前就听说过CSRF,而我大部分时间都听到的是:

防止CSRF攻击很重要,因为有人不会自动提交表单(使用机器人或其他东西)

嗯,这不是100%的真实,是吗?

我已经做了大约3年的网络抓取,并且提出请求,解析csrftokenmiddleware字段并将其与其他字段一起发布是非常简单的.

那么,它究竟是什么呢?

Dan*_*ger 17

想象一下电子银行网络应用程序,banking.example.com使用以下表格提交交易:

<form action="/transaction" method="post">
    <input type="text" name="beneficiary"/>
    <input type="text" name="amount"/>
    <input type="submit" value="Pay"/>
</form>
Run Code Online (Sandbox Code Playgroud)

攻击者现在可以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>
Run Code Online (Sandbox Code Playgroud)

然后,攻击者会欺骗受害者进入访问hacker.net,这将导致受害者的浏览器向电子银行应用程序发送POST请求,从而向黑客进行大量交易.这是有效的,因为受害者的浏览器愉快地将会话cookie与伪造的POST请求一起发送到电子银行应用程序.如果表单受到CSRF令牌的保护,则攻击者无法使受害者的浏览器发送有效的POST请求,因此无法进行攻击.

此类攻击称为跨站请求伪造(CSRF)攻击.

很明显,CSRF攻击也是人们在登录电子银行或其他关键Web应用程序时提供永远不会访问其他网站的建议的原因.

CSRF令牌不保护由常规授权用户自行提交的Web表单.为了防止这种情况,你可以使用CAPTCHA.


agf*_*agf 8

是的,您可以抓取表单并获取CSRF预防令牌.但是你不能在不抓取网站的情况下提交表单,也不能从其他人那里获得令牌然后提交表单 - 它链接到会话.这就是CSRF保护真正阻止的,欺骗用户提交表单的人.


CSRF的更一般描述,最初是为响应Django的评论框架和CSRF而发布的:

CSRF是一种攻击,在没有访问资源许可的情况下,某人有权访问该资源.

因此,例如,CSRF保护可以防止某人欺骗用户发布带有垃圾邮件或恶意软件链接的评论.或者,他们欺骗用户制作的请求可能会格式错误,导致您的网络服务器崩溃,或者包含旨在漏掉验证过程并导致数据库损坏或以其他方式危害您网站的代码.

因此,如果没有CSRF保护,理论上,某人可以欺骗登录用户提交他们实际上没有写的评论.

通过CSRF保护,Django将检测到它不是通过您网站上的实际表单提交的真实数据,并将拒绝它.