我一直在阅读有关使用同步器 token 模式来防止 CSRF(CSRF 表示跨站点请求伪造)的内容,但我不明白它实际上如何安全。
假设我有一个假银行网站 fakebank.com,有两个网址:
fakebank.com/withdrawForm.html
- 显示提款表单的 GET 请求fakebank.com/doWithdraw
- POST 到此网址进行提款
我对该安全漏洞的理解是,maliciousSite.com
可以欺骗向 fakebank.com/doWithdraw
发送 POST 请求,并且如果您当前登录到 fakebank ,POST就会成功。
假设我们实现了一个同步器 token 模式,它将在 fakebank.com/withdrawForm.html
上嵌入一个密码。 maliciousSite.com
不能只是欺骗该表单的 GET 请求、解析 html 结果、获取 token ,然后使用该 token 创建 POST 请求吗?
这是假设 fakebank.com 没有检查 HTTP Referrer 或 Origin,或者 maliciousSite.com
成功欺骗 Referrer/Origin 是 fakebank.com。
最佳答案
这是安全的原因,maliciousSite.com
不能简单地执行 GET
、窃取 token ,然后执行 POST
问题在于请求是由用户的浏览器完成的,而不是由 maliciousSite.com
上的服务器完成的。从 fakebank.com
返回的所有数据都会返回到用户的浏览器,而不是返回到 maliciousSite.com
的服务器。如果 maliciousSite.com
确实执行 GET 来检索 token ,则该 token 将与颁发给用户的 token 不同。由于同域限制,maliciousSite.com
无法将此 Cookie 设置到用户浏览器中以提交到 fakebank.com
。
CSRF POST
攻击的原理是欺骗用户的浏览器直接使用格式正确的 POST
请求来请求 fakebank.com/withdrawForm.html
。 fakebank.com
的服务器愉快地执行请求的 POST
,从而使用 POST
正文中提供的参数(其中包括目标帐户)转移资金属于由 maliciousSite.com
放置的攻击者)。 maliciousSite.com
的服务器不需要查看返回的数据,因为操作已经执行(除非 fakebank.com
使用这些 CSRF token , >maliciousSite.com
不可能知道,除非以某种方式泄露。它不能要求它)。如果 fakebank.com
使用 CSRF token ,则 maliciousSite.com
将提交缺少 token 的 POST
请求,从而表明存在潜在的 CSRF攻击正在进行中。
此方法的漏洞包括使用未充分保密并以某种方式泄露的 CSRF token 。此外,如果 CSRF token 不够随机,则 maliciousSite.com
可能能够猜测到它。此外,如果浏览器在执行相同域策略方面存在弱点,则可能会被利用。一般来说,现代浏览器不易受此影响。
如果这解释不够充分,请告诉我,我会尽力为您更好地阐明它。
关于javascript - 如何使用 Synchronizer Token Pattern 来防止 CSRF 安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049721/