ruby-on-rails – 在表单vs csrf令牌上执行Rails authenticity_t
在rails 4 app的同一页面上我有一个
在头部: <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="some_token" /> 在身体下面: <form action="/someaction" method="post"> <input name="utf8" type="hidden" value="✓" /> <input type="hidden" name="_method" value="patch" /> <input type="hidden" name="authenticity_token" value="another_token" /> js调用需要csrf令牌.但为什么表单令牌与csrf令牌不同?表单提交中使用了哪两个令牌? 解决方法
我已经做了一些研究来回答你的问题,这里有结果.
首先,我们来看看这部分: <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="some_token" /> 此部分由方法csrf_meta_tags生成.从源代码中我们可以看到: >< meta name =“csrf-param”/>的“content”属性值取自request_forgery_protection_token,默认情况下为:authenticity_token. 现在让我们看一下这部分: <input type="hidden" name="authenticity_token" value="another_token" /> 从源头我们可以看到: >此隐藏输入由extra_tags_for_form方法返回. 因此,如果您没有在自定义令牌的选项中手动设置authenticity_token参数,并且不满足导致将令牌值设置为false的条件(将在下面提到),则token_tag方法将收到nil并调用相同的form_authenticity_token方法用于< meta name =“csrf-token”/>标签创建.顺便说一下,为了填充输入的名称属性,它也使用request_forgery_protection_token,当< meta name =“csrf-param”/>时使用.标签生成发生. 并且因为这一切都发生在同一个请求中,所以调用form_authenticity_token方法应该在两种情况下都返回相同的结果.
在表单提交时将使用来自隐藏输入的令牌. 来自< meta />的令牌也可以使用,但仅当满足以下所有conditions(使token_tag方法的令牌参数设置为false)时才会满足: >:remote => true应该在form_tag的选项中传递.
至于这个问题,可能是因为缓存而出现这个问题.或者,可能,如果您使用Turbolinks gem,它可能会导致此问题(如果您完全刷新页面并再次比较令牌,则可以检查此问题).有关Turbolinks问题的更多信息,请查看this question. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- InfluxDB学习之InfluxDB常用函数(一)聚合类函数
- As3 的组件资料(不定时收集)
- ruby-on-rails – Kaminari:未定义的方法`total
- Coursera公开课笔记: 斯坦福大学机器学习第七课“
- c# – 如何向datagridview添加新行?
- ruby-on-rails – Rails 4 Paperclip FactoryGir
- SQLite3在windows下的配置(链接VC++或者VS)
- ruby-on-rails – 如何配置Google Domain Heroku
- c# – BackgroundWorker RunWorkerCompletedEven
- c – 如何强制cmake链接自定义gcc库