好像我对CSRF的理解不正确?

时间:2011-09-01 18:58:47

标签: csrf

在阅读了很多关于CSRF的文件后,我仍然有点困惑。所以我希望有人可以向我解释一下:

  1. 让我们说如果我有一个仅针对经过身份验证的用户的个人资料页面,请说abc.com/profile向我显示我的所有私人信息。如果我登录,然后转到“坏”网站,该网站可以以某种方式获取并解析我的个人资料页面吗? (我通过在另一个网站上打开firebug控制台做了一点经验,然后请求我的个人资料页面,看起来至少我可以在“网络”标签的“响应”中看到整个内容,还没想到然而,如何获取这些内容并解析它。但也许它可能?)

  2. 现在假设我的个人资料页面上有一个表单,当然这个表单有csrf令牌。现在,如果攻击者可以获取我的profule页面,他可以解析该内容,获取令牌然后提交假表单?

  3. 现在假设1和2是正确的,我该怎么做才能防止这种情况发生?

3 个答案:

答案 0 :(得分:9)

你的观点不太正确......但请采取这种方案。

攻击示例


想象一下,用户登录伪造国家银行 - GoodBank.com,余额为1,000,000金币。

MaliciousSite.com上,有<img>或其他一些通用JavaScript,可让您向GoodBank.com发出请求。

<img>的{​​{1}}为src


现在,此网站已在您的用户帐户下发出请求,并导致您调用一个您不会拥有的页面。

现在,您可能认为可以通过仅使用POST来防止这种情况,但这些也不安全。 正确的方法是在表单中使用CSRF令牌,并且在提交表单时,您应该检查您收到的CSRF令牌是否与发布的内容相同。

请勿使用these measures to protect yourself

  • 秘密饼干
  • 仅接受POST请求
  • 多页表格
  • 网址重写

而是使用这样的标记:

http://www.goodbank.com/account/transfer.php?amount=10000&sentTo=malicioususer

点击此处查看详细解释:CSRF Cheat Sheet

答案 1 :(得分:6)

你的第一点不正确 您无法从客户端上的其他域读取内容。

因此,恶意网站无法读取CSRF令牌。

您可以将请求发送到其他域(这是CSRF攻击所做的),但您无法阅读回复。

答案 2 :(得分:1)

这可能与提出的问题没有直接关系,但需要指出跨站点脚本攻击可以为CSRF打开大门。甚至用于防止CSRF的基于令牌的解决方案也可能受到XSS的影响。

采取以下方案。

用于更新用户信息的表单。

<script>
...
var userID=getUserId();//method makes AJAX call to get user ID
...
</script>
...
<form name="UpdateUserProfile">
   <input type='hidden' id='userId' value='userID_attacker_cannot_guess'>
   <input type='hidden' id='userName' value='goodUser'>
   <input type='hidden' id='email' value='goodUser@goodsite.com'>
    ...
 </form>

假设用户ID是唯一的并且无法轻易猜到,我们可以在没有令牌的情况下阻止CRSF。(攻击者请求将无法拥有正确的用户ID)。

但是如果攻击者可以使用XSS攻击读取userID的值,那么他就可以制作伪造的请求以包含正确的用户ID。

虽然CSRF攻击不需要XSS,但它会更容易。

检查以下资源。

Cross-Site Request Forgery (CSRF)-OWASP

Cross-site Scripting (XSS)-OWASP