我很久以前就听说过 CSRF ,我大部分时间听到的是:
防止CSRF攻击非常重要,因为有人不会自动提交您的表单(使用机器人或其他东西)
嗯,这不是100%正确,是吗?
我已经进行了大约3年的网络抓取,并且提出请求非常简单,解析csrftokenmiddleware
字段并将其与其他字段一起发布。
那么,它到底是什么意思?
答案 0 :(得分: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>
攻击者现在可以在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攻击也是人们在登录电子银行或其他关键网络应用程序时提供永远不会访问其他网站的建议的原因。
CSRF令牌不保护由常规授权用户自行提交的Web表单。为了避免这种情况,您可以使用CAPTCHA。
答案 1 :(得分:8)
是的,您可以抓取表单并获取CSRF预防令牌。但是你无法提交表单而不抓取网站,而你不能从别人那里获得一个令牌然后提交表单 - 它链接到一个会话。这就是CSRF保护真正阻止的,有人欺骗用户提交表单。
CSRF的更一般性描述,最初发布以回复Django's comments framework and CSRF:
CSRF是一种攻击,未经访问资源的人会欺骗有权访问该资源的人。
因此,例如,CSRF保护可以阻止某人欺骗用户发布带有垃圾邮件或恶意软件链接的评论。或者,他们诱骗用户制作的请求可能会格式错误,导致您的网络服务器崩溃,或者包含旨在漏掉验证过程并导致数据库损坏或以其他方式危害您网站的代码。
因此,如果没有CSRF保护,理论上,某人可以欺骗登录用户提交他们实际上没有写的评论。
通过CSRF保护,Django将检测到它不是通过您网站上的实际表单提交的真实数据,并将拒绝它。
答案 2 :(得分:1)
它是对不同类型场景的保护。 有时,攻击者可以在任何登录用户可以访问的位置向您的页面注入javascript(iframe或img src-s)。 当用户访问页面时(假设有一个带有注释的页面,一个注释请求攻击者发布的链接),该请求由登录用户的浏览器进行,并与他的cookie一起进行。 CSRF基本上保护了这种触发的提交(简单的客户端提交)。当然,任何攻击者都可以请求页面,解析它以获取令牌并使用令牌创建请求,但不能在登录用户旁边执行此操作。
答案 3 :(得分:0)