javascript - 如何使用 Synchronizer Token Pattern 来防止 CSRF 安全?

标签 javascript security web csrf

我一直在阅读有关使用同步器 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.htmlfakebank.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/

相关文章:

windows - Windows 私有(private)命名空间可以根据完整性级别隔离进程吗?

java - 如何将 Web 生成的内容导入到 Java 应用程序中?

php - 为什么 Apache 支持 PHP、Perl、Python... 但不支持 Servlet?

javascript - 使用phonegap时,window.resolveFileSystemURI()和window.requestFileSystem都不存在?

javascript - 扩展粘性侧边栏固定位置 : push down content, 如何

ruby-on-rails - 如何限制 Rack 中的请求大小?

php - 在 PHP 中避免代码注入(inject)的最佳方法

javascript - 替换空格但不替换括号之间的空格

javascript - 如何防止 jwt token 在 angularjs 应用程序的页面刷新时丢失?

html - 如何垂直对齐 css3 圆圈内的一些文本?