我最近读了一篇关于CSRF攻击以及Rails如何防御它们的文章,其中有些东西我不理解,也找不到解释。
从我从Nvisium的博客文章,官方指南和这个有价值的视频中了解到,Rails通过以下方式防止CSRF攻击:
- 嵌入
authenticity_token
- 在处理POST请求时,将提交的令牌值与用户会话中关联的令牌值进行比较。
我不明白的是:自authenticity_token
是一个公开可用的值,不能通过简单地检查网页来访问,当攻击者可以简单地复制这个值并将其插入他/她正在创建的恶意表单中时,这种保护是如何实现的?
当然,我的直觉告诉我,情况比这更复杂,但我就是找不到任何解释,如何避免上述情况。如果你有一个解释或知道任何来源,阐明这一点,我将非常感激
authenticity_token
确保你的应用程序收到的任何提交都匹配一个应用程序知道的会话。这并不能有效对抗中间人攻击,但却能够有效对抗那些随机向你的应用发送垃圾信息的人。它不会阻止合法但恶意的用户向你的应用发送数据,只会阻止那些没有遵循你的应用路径的用户。
基本上,这种保护是针对服务器的,而不是客户端。这绝不是对攻击的完全保护,但确实关闭了一个攻击途径。
我认为JohnP提到的重要部分是它"只阻止不遵循应用程序路径的请求"。
想象一下,有人给你发了一封电子邮件,上面有一个链接,可以给Stackoverflow的帖子投票,上面有一个描述,比如点击这里要钱。你点击这个链接,如果没有CSRF,这个链接你实际上会给这篇文章投票。但这对CSRF预防不起作用,因为请求缺乏随机令牌,将被拒绝。
Upvoting当然只是一个无害的例子,但它可能会泄露数据,改变会话状态,或操纵最终用户的帐户。