为了账号安全,请及时绑定邮箱和手机立即绑定

理解Rails的真实性令牌

/ 猿问

理解Rails的真实性令牌

慕慕森 2019-06-27 15:54:30

理解Rails的真实性令牌

我在Rails中遇到了一些关于真实性令牌的问题,因为我现在已经有很多次了。

但我真的不想只解决这个问题继续下去。我真的很想了解真伪标记。好吧,我的问题是,你是否有关于这个问题的完整的信息来源,或者你是否会花时间在这里详细解释?


查看完整描述

3 回答

?
慕桂英4014372

发生了什么

当用户查看要创建、更新或销毁资源的表单时,Rails应用程序会创建一个随机的authenticity_token,将此令牌存储在会话中,并将其放置在表单中的隐藏字段中。当用户提交表单时,Rails将查找authenticity_token,将其与存储在会话中的请求进行比较,如果它们匹配,则允许继续请求。

为什么会这样

由于真实性令牌存储在会话中,因此客户端无法知道其值。这可以防止人们在没有查看应用程序本身的情况下将表单提交到Rails应用程序。假设您使用的是服务A,您登录了该服务,一切都正常。现在假设您使用服务B,您看到了您喜欢的图片,然后按下图片以查看更大的大小。现在,如果服务B中有一些邪恶的代码,它可能会发送一个请求到服务A(您已经登录),并请求删除您的帐户,方法是将一个请求发送到http://serviceA.com/close_account..这就是我们所知的跨站点请求伪造.

如果服务A使用的是真实性令牌,则此攻击向量不再适用,因为来自服务B的请求将不包含正确的真实性令牌,并且将不允许继续。

API文档描述有关元标记的详细信息:

启动csrf保护。protect_from_forgery方法,该方法检查令牌,如果会话与预期的不匹配,则重新设置会话。默认情况下,会为新的Rails应用程序生成对此方法的调用。令牌参数命名为authenticity_token默认情况下。必须通过以下方式将此令牌的名称和值添加到呈现窗体的每个布局中csrf_meta_tags在HTML的头上。

注记

记住,Rails只验证非幂等方法(POST、PUT/修补程序和DELETE)。未检查GET请求的真实性令牌。为什么?因为HTTP规范声明GET请求是幂等的,所以应该在服务器上创建、更改或销毁资源,并且请求应该是幂等的(如果您多次运行相同的命令,那么每次都应该得到相同的结果)。

而且,真正的实现比在开始时定义的要复杂一些,确保了更好的安全性。Rails不会对每个表单发出相同的存储令牌。它也不会每次生成和存储不同的令牌。它在会话中生成并存储加密哈希,并在每次呈现页面时发出新的加密令牌,可以与存储的令牌匹配。看见请求伪造保护.rb.

教益

使用authenticity_token以保护您的非幂等方法(POST、PUT/修补程序和DELETE)。还要确保不允许任何可能修改服务器上资源的GET请求。


编辑:查帐@erturne的评论关于GET请求是幂等的。他用比我更好的方式来解释这件事。


查看完整回答
反对 回复 2019-06-27
?
吃鸡游戏

真实性标记的设计使您知道您的表单是从您的网站提交。它是从运行它的机器上生成的,其唯一标识符只有您的机器才能知道,因此有助于防止跨站点请求伪造攻击。

如果您很难接受Rails拒绝Ajax脚本访问,则可以使用

<%= form_authenticity_token %>

若要在创建窗体时生成正确的令牌,请执行以下操作。

您可以在文献资料.


查看完整回答
反对 回复 2019-06-27
?
蝴蝶刀刀

什么是CSRF?

真实性令牌是针对跨站点请求伪造(CSRF)的一种对策.你问什么是CSRF?

攻击者可以在不知道会话令牌的情况下劫持会话。

假想:

  • 访问你银行的网站,登录。
  • 然后访问攻击者的站点(例如,来自不受信任组织的赞助广告)。
  • 攻击者的页面包括与银行“转移资金”表单相同字段的表单。
  • 攻击者知道您的帐户信息,并有预先填写的表单字段,以将资金从您的帐户转移到攻击者的帐户。
  • 攻击者的页面包括向银行提交表单的Javascript。
  • 当表单提交时,浏览器将包含银行站点的cookie,包括会话令牌。
  • 银行把钱转到攻击者的账户上。
  • 表单可以是不可见的iframe,所以您永远不知道攻击发生了。
  • 这被称为跨站点请求伪造(CSRF)。

CSRF溶液:

  • 服务器可以标记来自服务器本身的表单。
  • 每个表单必须包含一个附加的身份验证令牌作为隐藏字段。
  • 令牌必须不可预测(攻击者无法猜测)。
  • 服务器在其页面中的窗体中提供有效的令牌。
  • 当表单发布时,服务器检查令牌,拒绝没有正确令牌的表单。
  • 示例令牌:使用服务器密钥加密的会话标识符。
  • Rails会自动生成这样的令牌:请参见每种形式中的RETURY_TOKEN输入字段。


查看完整回答
反对 回复 2019-06-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信