我一直在阅读有关使用同步标记模式,以防止CSRF攻击(CSRF意味着跨站请求伪造),我不知道它是如何真正安全的。
比方说,我有两个URL假银行网站fakebank.com:
-
fakebank.com/withdrawForm.html
-这显示取钱形式的GET请求 -
fakebank.com/doWithdraw
- POST到这个网址做退出
我的安全漏洞的理解是, maliciousSite.com
可以欺骗一个POST请求fakebank.com/doWithdraw
,如果您目前在以fakebank登录状态,则POST会成功。
比方说,我们实现一个同步标记模式,这将嵌入一个秘密代码fakebank.com/withdrawForm.html
。 不能maliciousSite.com
只是恶搞为形式的GET请求,解析HTML结果,获得令牌,然后创建与该令牌POST请求?
这是假设fakebank.com不检查HTTP推荐或原产地或maliciousSite.com
成功地欺骗了介绍人/产地是fakebank.com。
之所以这样是安全的, maliciousSite.com
不能简单地做一个GET
,偷令牌,然后做一个POST
是该请求是由用户的浏览器中完成,而不是在服务器maliciousSite.com
。 从返回的所有数据fakebank.com
返回给用户的浏览器 ,而不是在服务器maliciousSite.com
。 如果maliciousSite.com
确实执行GET来检索令牌,这将是一个不同的令牌比被发布给用户。 maliciousSite.com
不能设置这个cookie,用户的浏览器提交给fakebank.com
因为同域限制。
该CSRF POST
攻击通过欺骗用户的浏览器变成请求fakebank.com/withdrawForm.html
直接使用正确形成POST
请求。 在服务器fakebank.com
愉快地执行所请求的POST
,从而转印利用在提供的参数资金POST
体(包括属于该被放在那里的攻击者的目的地帐户maliciousSite.com
)。 在服务器maliciousSite.com
并不需要看到返回的数据,因为已经采取行动(除非fakebank.com
使用这些CSRF令牌,其中maliciousSite.com
不可能知道,除非它以某种方式被泄露它不能要求它)。 如果fakebank.com
使用CSRF令牌,然后maliciousSite.com
将提交一个POST
是缺少凭证要求,从而表明正在进行潜在的CSRF攻击。
这种方法的漏洞包括使用CSRF令牌未保持足够的秘密,并以某种方式被泄露。 此外,如果CSRF令牌是不够随机的,那么maliciousSite.com
或许能猜到它。 此外,如果在同一个域策略的浏览器的执法虚弱,这可能被利用。 一般来说,现代的浏览器不容易受到此。
请让我知道这是一个不足的解释,我会尝试一点点更好地表达它。
而这也正是这一点。 该同源策略在浏览器不允许GET请求到其他站点。 因此,没有网站可以从其他浏览器中只使用javascipt的获得CSRF令牌。