www.mybank.com
mybank.com
将(在概念上)请求http://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>
。 (不需要您的帐号,因为您的登录名暗示了该帐号。)www.cute-cat-pictures.org
却不知道这是一个恶意网站。mybank.com
(需要运气!),则他们可以在其页面上包含诸如http://www.mybank.com/transfer?to=123456;amount=10000
(其中123456
是开曼群岛帐户10000
是您以前认为很高兴拥有的金额)。www.cute-cat-pictures.org
页面,因此您的浏览器将发出该请求。www.mybank.com
cookie,并且看起来完全合法。你的钱去了!这是没有 CSRF 令牌的世界。
现在,使用CSRF 令牌获得更好的效果:
http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971
://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795095028841971。mybank.com
为您提供服务时,它将包含在他们自己的网页上。每次他们向任何人提供任何页面时,情况都是不同的。www.mybank.com
拒绝。结果:您保留了10000
货币单位。我建议您将其中一些捐献给 Wikipedia。
(你的旅费可能会改变。)
编辑评论值得阅读:
这将是值得一提的从脚本www.cute-cat-pictures.org
一般不会有访问令牌从您的防 CSRF www.mybank.com
因为 HTTP 的访问控制。对于一些不合理地发送标头Access-Control-Allow-Origin: *
人来说,此说明很重要:* 对于每个网站响应,却不知道它的用途,只是因为他们不能使用其他网站的 API。
是的,帖子数据是安全的。但是该数据的来源不是。这样,在浏览攻击者的网页时,有人可以诱骗 JS 用户登录到您的站点。
为了防止这种情况,django 将在 cookie 和表单数据中发送一个随机密钥。然后,当用户 POST 时,它将检查两个密钥是否相同。万一被用户欺骗,第三方网站将无法获取您网站的 Cookie,从而导致身份验证错误。
该网站在制作表单页面时会生成一个唯一的令牌。需要此令牌才能将数据发布 / 获取回服务器。
由于令牌是由您的网站生成的,并且仅在生成带有表单的页面时提供,因此其他网站无法模仿您的表单 - 他们没有令牌,因此无法发布到您的网站。