73

我是一名PHP开发人员,通过阅读以下内容学习Ruby on RailsMichael Hartl的教程这里引用了这本书中的一句话,指的是csrf元数据标记:

…Rails方法csrf元数据标记[阻止]跨站点请求伪造(CSRF)是一种恶意网络攻击。不要担心细节(我不知道);只要知道Rails正在努力保持您的应用程序安全。

问题是,我真的很好奇。如何插入csrf程序csrf-token公司元标记阻止CSRF?我试着用谷歌搜索,但什么也没找到。

1
  • 6
    @MikhailNikalyukin谢谢(我想)。这解释了CSRF,我已经知道了它的基本知识,但它没有解释如何元标签(与隐藏表单字段相反)可以阻止它。你知道答案吗?
    – 尼克
    评论 2012年4月3日15:54

5个答案5

重置为默认值
81

csrf元数据标记基本上实现了与隐藏表单字段相同的功能,但可以为不与表单绑定的javascript请求提供一种简单的获取令牌的方式。

如果您使用jquery-ujs公司库-该元标记的内容会自动添加到任何ajax请求中(作为请求头)。

2
  • 又短又甜。你回答了我的问题。谢谢!
    – 尼克
    评论 2012年8月18日5:46
  • 1
    只需完成:这篇文章提到ujs还可以使用它们来更新过时的片段缓存。相关uJS源行如果有像我这样的新手想知道:表单标签和其他助手也将CSRF标记添加到表单中,因此他们可以在没有J的情况下工作。 评论 2014年11月12日21时11分
62

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

我想澄清一下csrf元数据标记它本身并不能阻止无关页面向您的GMail(或攻击目标的任何其他服务)发出请求,但csrf元数据标记用于验证所述请求的有效性。无效的请求(即来自跨站点脚本尝试的请求)应无法通过验证,因此将被丢弃。

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

之前csrf元数据成功的跨站点脚本攻击允许恶意站点向web应用程序提交数据,使请求看起来好像是代表用户执行的。那么,假设您是一个web服务的管理员,在一个浏览器选项卡中,您登录到该服务的管理面板。如果在另一个选项卡中打开的恶意站点针对您的服务发起攻击,恶意站点可能会运行发出管理请求的脚本,例如从数据库中转储用户列表,窃取其他敏感数据,或可能损害、损坏或破坏服务中包含的数据,从服务器的角度来看,所有这些都是来自管理员本身的有效请求。这个csrf元数据标记是一种签署请求的方式,有助于阻止此类尝试成功。

有一个更详细的解释在此处可用.

在Rails生成的页面上创建一个“查看源代码”也很有教育意义,您将看到CSRF标记的样子。

1
  • 2
    谢谢你的详细回答!虽然它很有帮助,而且我能够从中学习,但它并没有解释如何元标签帮助预防CSRF(而不是隐藏表单字段)。但我真的很感谢你的时间。再次感谢!
    – 尼克
    评论 2012年8月18日5:45
17

在Rails中,其工作方式如下

定义csrf_meta_tags如果保护反贿赂?[标记('meta',:name=>'csrf-param',:content=>request_forgery_protection_token),标记('meta',:name=>'csrf-token',:content=>form_authenticity_token)].join(“\n”).html_safe结束结束

查看更多详细信息,只需单击

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

这是漂亮的博客

但是,我更喜欢国家脆弱性数据库,以下是很好的解释

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

CWE-79:网页生成期间输入的不正确中和(“交叉脚本”)

查看此文档以了解CWE-常见弱点枚举

  • 1
    到漏洞数据库的链接很棒! 评论 2012年4月3日19:06
  • 2
    谢谢你的详细回答!虽然它很有帮助,而且我能够从中学习,但它并没有解释如何元标签帮助预防CSRF(而不是隐藏表单字段)。不过,源代码的链接稍微解释了这一点。无论如何,我真的很感谢你的时间。再次感谢!
    – 尼克
    评论 2012年8月18日5:46
  • 嗨,尼克,我有问题的方向,我会很快改变我的答案,并向你更新。大部分时间是在这个周末。
    – AMIC明
    评论 2012年8月21日18:35
4

csrf元数据指示ajax请求将这些参数用作向服务器发出请求的表单参数之一。Rails希望csrf作为表单主体(params)的一部分来处理您的请求。使用这些元标记,您可以构造表单主体或csrf头以满足您的需要。我希望这个答案对你的问题有帮助。

2

助手的输出csrf元数据:

<meta name=“csrf-param”content=“authenticity_token”/><meta name=“csrf-token”content=“J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==”/>

这个令牌可以包含在ajax请求中。Exapmle公司(jquery-ujs公司):

https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70

csrfToken:函数(){return$('meta[name=csrf-token]').attr('content');},//必须包含CSRF令牌的URL参数csrfParam:函数(){return$('meta[name=csrf-param]').attr('content');},//确保每个Ajax请求都发送CSRF令牌CSRFProtection:功能(xhr){var标记=rails.csrfToken();if(标记)xhr.setRequestHeader('X-CSRF-token',标记);},

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.