【发布时间】:2014-06-21 08:38:26
【问题描述】:
在我的一个控制器中,我编写了以下代码来保护某些页面免受 CSRF 影响。
protect_from_forgery :only => [:foo, :bar]
当我加载对应于foo 和bar 的URL 并查看HTML 时,我看不到任何隐藏的输入字段或包含任何安全令牌的元标记,如here 所述。
但是,在测试期间,我确实观察到CSRF 对这些页面无效,尽管它对同一应用程序中不受保护的其他页面有效。
那么Rails 4 将用于验证请求是否来自原始页面的安全令牌存储在哪里?
请注意,我已经通读了Ruby On Rails Security Guide,并且从protect_from_forgery 的部分中,它说
这将自动在所有表单和 Ajax 中包含一个安全令牌 Rails 生成的请求。如果安全令牌与什么不匹配 是预期的,会话将被重置。
问题在于,在启用 CSRF 保护的页面上,表单中似乎缺少此安全令牌,即使 CSRF 确实对它们无效。
请注意,此代码来自class project,其中一个目标是执行点击劫持攻击以绕过 CSRF 项目。我在这里问的问题是与作业的目的正交。
我只是好奇 Rails 究竟是如何处理 CSRF 的。
直接执行rails server后,我找不到安全令牌的相关URL是http://localhost:3000/protected_transfer。
【问题讨论】:
标签: ruby-on-rails security csrf csrf-protection