Rails:如何做csrf

通过阅读Michael Hartl的教程,我是学习Ruby on Rails的PHP开发人员。 这里引用了csrf_meta_tag

... Rails方法csrf_meta_tag [阻止]跨站请求伪造(CSRF),一种恶意网页攻击。 不要担心细节(我不知道); 只知道Rails正在努力确保您的应用程序安全。

事情是,我真的很好奇。 插入csrf-paramcsrf-token元标记如何防止CSRF? 我试过谷歌搜索,但找不到任何东西。


csrf_meta_tag基本上实现了与隐藏表单字段相同的功能,但是可以提供与表单无关的JavaScript请求,这是获取令牌的简单方法。

如果您使用jquery-ujs库,那么元标记的内容会自动添加(作为请求标头)给所做的任何Ajax请求。


csrf_meta_tag将实质上是数字签名的内容插入到页面中,充当验证,实际上来自正确登录的用户的请求进入应用程序服务器。 这有助于防止跨站点脚本(当您在另一个选项卡中登录到GMail时,完全不相关的页面上的脚本会触发请求说GMail,而不是)。

我想澄清一下, csrf_meta_tag本身并不会阻止无关页面向您的GMail(或任何其他攻击目标的服务)发起请求,但csrf_meta_tag的“数字签名”用于验证所述请求的有效性。 无效的请求(即,来自跨站脚本尝试)将失败验证,因此被丢弃。

换句话说,从攻击者的角度来看:

csrf_meta_tags存在之前(它们不以任何方式排除Rails),成功的跨站脚本攻击允许恶意网站向Web应用程序提交数据,使得请求看起来好像是以用户的名义完成的。 因此,假设您是Web服务的管理员,并且您在一个浏览器选项卡中登录了该服务的管理面板。 如果在另一个选项卡中打开的恶意网站针对您的服务进行攻击,那么恶意网站可能会运行发出管理请求的脚本,例如从数据库中转储用户列表,窃取其他敏感数据或潜在地损害,破坏,或者销毁服务中包含的数据,所有这些都是从服务器的角度来看是管理员本身的有效请求。 csrf_meta_tag是一种签署请求的方式,并有助于阻止这种尝试成功。

这里有更详细的解释。

在您的一个Rails生成的页面上执行“查看源代码”也是一种教育,您将看到CSRF标签的外观。


在Rails中,它将以这种方式工作

def csrf_meta_tags
    if protect_against_forgery?
      [
        tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token),
        tag('meta', :name => 'csrf-token', :content => form_authenticity_token)
      ].join("n").html_safe
    end
  end

只需点击查看更多详情

您还需要检查Ruby On Rails安全指南

这里是漂亮的博客

但是 - 我喜欢国家漏洞数据库,这里是很好的解释

CWE-352:跨站点请求伪造(CSRF)

CWE-79:网页生成过程中对输入的中和不当(“跨站脚本”)

检查此文件是否存在CWE - 常见弱点列举

链接地址: http://www.djcxy.com/p/25805.html

上一篇: Rails: How Does csrf

下一篇: Understanding the Rails Authenticity Token