Rails:csrf_meta_tag如何工作?

Nic*_*ick 62 ruby-on-rails csrf

我是一名PHP开发人员,通过阅读Michael Hartl的教程来学习Ruby on Rails .以下是本书的引用,指的是csrf_meta_tag:

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

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

Fre*_*ung 75

csrf_meta_tag 基本上与隐藏表单字段完成相同的事情,但是提供与表单无关的javascript请求是获取令牌的简单方法.

如果使用jquery-ujs库,则会自动将该元标记的内容添加(作为请求标头)给任何ajax请求.


jef*_*unt 56

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

我想澄清一下,csrf_meta_tag它本身并不能阻止一个不相关的页面向您的GMail(或任何其他攻击目标服务)发出请求,但其中的"数字签名" csrf_meta_tag用于验证其有效性.说请求.无效请求(即来自跨站点脚本尝试)应该验证失败,因此被丢弃.

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

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

还有一个更详细的解释可以在这里找到.

在你的一个Rails生成的页面上做一个"查看源代码"也很有教育意义,你会看到CSRF标签的样子.

  • 谢谢详细解答!虽然它很有帮助并且我能够从中学习,但它并没有解释 *meta tags* 如何帮助预防 CSRF(与隐藏表单字段相反)。但我真的很感激你的时间。再次感谢! (2认同)

AMI*_*ING 14

在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
Run Code Online (Sandbox Code Playgroud)

点击查看更多细节

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

这是一个不错的博客

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

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

CWE-79:网页生成期间输入的中和不当('跨站点脚本')

查看此文档以获取CWE - Common Weakness Enumeration

  • 谢谢你的详细解答!虽然它很有帮助,但我能够从中学习,但它没有解释*meta标签*如何帮助CSRF预防(而不是隐藏的表单字段).但是,源代码的链接解释了一点.无论如何,我真的很感谢你的时间.再次感谢! (2认同)