在阅读了很多关于CSRF的文件后,我仍然有点困惑。所以我希望有人可以向我解释一下:
让我们说如果我有一个仅针对经过身份验证的用户的个人资料页面,请说abc.com/profile向我显示我的所有私人信息。如果我登录,然后转到“坏”网站,该网站可以以某种方式获取并解析我的个人资料页面吗? (我通过在另一个网站上打开firebug控制台做了一点经验,然后请求我的个人资料页面,看起来至少我可以在“网络”标签的“响应”中看到整个内容,还没想到然而,如何获取这些内容并解析它。但也许它可能?)
现在假设我的个人资料页面上有一个表单,当然这个表单有csrf令牌。现在,如果攻击者可以获取我的profule页面,他可以解析该内容,获取令牌然后提交假表单?
现在假设1和2是正确的,我该怎么做才能防止这种情况发生?
答案 0 :(得分:9)
你的观点不太正确......但请采取这种方案。
想象一下,用户登录伪造国家银行 - GoodBank.com,余额为1,000,000金币。
在MaliciousSite.com
上,有<img>
或其他一些通用JavaScript,可让您向GoodBank.com
发出请求。
<img>
的{{1}}为src
。
现在,此网站已在您的用户帐户下发出请求,并导致您调用一个您不会拥有的页面。
现在,您可能认为可以通过仅使用POST来防止这种情况,但这些也不安全。 正确的方法是在表单中使用CSRF令牌,并且在提交表单时,您应该检查您收到的CSRF令牌是否与发布的内容相同。
请勿使用these measures to protect yourself:
而是使用这样的标记:
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,但它会更容易。
检查以下资源。