为什么要在POST请求中要求CSRF令牌呢?

时间:2014-01-16 08:08:57

标签: security csrf

我的理解是CSRF阻止攻击者使用<img>标记让受害者的浏览器发送使用会话cookie进行身份验证的请求。鉴于<img>总是使用GET请求而不是POST提交,那么为什么在POST请求中需要CSRF令牌呢?

此外,攻击者无法在不能运行代码(即XSS攻击)的情况下在网页中提交表单,在这种情况下,无论如何他们都可以规避您的CSRF保护。

3 个答案:

答案 0 :(得分:3)

攻击者可以在自己的网站上托管表单,但不要求用户提交表单。他们可以使用JavaScript来执行此操作:

<form method="post" action="http://www.example.com/executeAction">
    <input type="hidden" name="action" value="deleteAllUsers">
</form>

<script>document.forms[0].submit()</script>

IFrame注入更多是XSS漏洞。 XSS漏洞比CSRF漏洞更严重,因为可以造成更多损害,并且它将始终覆盖您拥有的任何CSRF保护。确保始终正确编码输出所在上下文的输出(例如,编码为HTML或适用于JavaScript)。

查看Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet - 他们的最佳建议是使用 Synchronizer Token Pattern ,它与your answer中的链接类似,但可以与Cookie结合使用。< / p>

此外,还有XSS (Cross Site Scripting) Prevention Cheat Sheet的链接。

答案 1 :(得分:1)

跨站点请求伪造是指一个站点(比如evil.example.com)可以强制访问用户向另一个站点发出请求(例如example.com)。它并没有真正强迫用户,因为通过表单提交或javascript嵌入图像(HTTP GET请求)或POST请求并不困难。

  1. 您不应通过HTTP GET请求更改状态或数据。 img标签(获取请求)不应该做任何改变。如果你允许这个...停止它。 :)

  2. POST请求需要包含远程攻击者无法猜测的值。通常,这是每个请求的随机值。

  3. 所以,是的,CSRF是一个已经证明的,已知的漏洞,你应该打扰防范。

答案 2 :(得分:0)

做了一些进一步的调查:

攻击者可能会在自己的网站上托管<form>,并提交到目标网站(您的网站)。他们所需要做的就是让受害者提交此表格,并将提交他们的cookies以及可能的身份验证。

攻击者也可以向您的网站注入<iframe>,然后就可以显示此恶意<form>

我认为token-based approach对我的用例来说是更好的解决方案。