我正在遇到有关Rails中的Authenticity Token的一些问题,因为我现在已经多次了.
但我真的不想只是解决这个问题而继续下去.我真的很想了解真实性令牌.那么,我的问题是,您是否有关于此主题的完整信息来源,或者您是否会花时间在此详细解释?
当我遇到一些真实性令牌问题时,我正在研究一个新的Rails 4应用程序(在Ruby 2.0.0-p0上).
在编写响应json的控制器时(使用respond_to类方法),当我尝试使用创建记录时,我create开始ActionController::InvalidAuthenticityToken尝试异常curl.
我确定我设置-H "Content-Type: application/json"并设置数据,-d "<my data here>"但仍然没有运气.
我尝试使用Rails 3.2(在Ruby 1.9.3上)编写相同的控制器,并且我没有任何真实性令牌问题.我四处搜索,看到Rails 4中的真实性令牌发生了一些变化.据我所知,它们不再自动插入表格了?我想这会以某种方式影响非HTML内容类型.
有没有办法解决这个问题,而无需请求HTML表单,抢夺真实性令牌,然后使用该令牌发出另一个请求?还是我完全错过了一些非常明显的东西?
编辑:我刚尝试使用脚手架在新的Rails 4应用程序中创建一个新记录而不改变任何东西,我遇到了同样的问题所以我想这不是我做的事情.
这可以工作,但因为缺少真实性令牌而被停止:
$(".ajax-referral").click(function(){
$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
return false;
});
Run Code Online (Sandbox Code Playgroud)
所以我试着像这样添加它:
$(".ajax-referral").click(function(){
$.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
return false;
});
Run Code Online (Sandbox Code Playgroud)
并且它正确地将auth_token作为参数传递,但似乎丢失了我的表单的其余部分.
无论如何既可以完成发送有效的表单数据,也可以完成真实性令牌?
这是一个rails环境.而且我脑子里有这个.
= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情
1.
= hidden_field :authenticity_token, :value => form_authenticity_token
Run Code Online (Sandbox Code Playgroud)
2.
$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});
Run Code Online (Sandbox Code Playgroud)
3.
// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
if ( settings.type != 'GET' ) {
settings.data = (settings.data ? settings.data + "&" …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Ruby on Rails表单,其中包含authenticity_token.不幸的是,我错过了当您页面缓存此页面时,真实性令牌变为无效.我很高兴我弄清楚了.
在这种情况下你如何解决缓存?
我正在模拟来自外部服务的请求,该服务不具有真实性令牌.如果skip_before_action :verify_authenticity_token丢失,我希望测试失败.
我如何从Rspec请求规范中执行此操作?
目前我正在使用post如下,但它很高兴被接受.
post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"}
Run Code Online (Sandbox Code Playgroud) 我们的生产服务器几个月来一直在生成无效的真实性令牌错误.在几乎所有发送(PUT | POST | DELETE)请求的表单上都会产生错误.有时会发生错误,有时则不会.似乎没有押韵或理由为什么它们会发生.错误本身并不经常发生,但这对我们来说是一种担忧.下面是导致此错误的典型表单的示例.
<form class="button_to" method="post" action="/lesson_progress_trackers/333">
<input type="hidden" name="_method" value="patch">
<input class="finish-lesson-button" type="submit" value="Done!">
<input type="hidden" name="authenticity_token" value="Qd3FsJZY2UXR9vahuFmaY5rrqA+J5xzGpl4cGI2Vwerx8PZPQtDMugz6oqoe3iviC+/U5zTYPdeX3apwbap09E==">
<input type="hidden" name="completed" value="true">
</form>
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所发现的.
protect_from_forgery with: :exception在我们的应用控制器中使用最终我想弄清楚如何解决这个问题.我的第一步是成功重现错误,但我甚至不能这样做.我的问题是:我能做些什么来帮助我找出造成这种情况的原因?我的选项已经用完了.谢谢!
forms ruby-on-rails session-cookies authenticity-token ruby-on-rails-4
我最近切换到谷歌关闭一个新项目.我在向ajax调用中的标头添加真实性令牌时遇到问题.我该怎么做呢?
我的Ajax片段(使用goog.net.XhrIo类):
var initialHTMLContent = superField[i].getCleanContents();
var data = goog.Uri.QueryData.createFromMap(new goog.structs.Map({
body: initialHTMLContent
}));
goog.net.XhrIo.send('/blogs/create', function(e) {
var xhr = /** @type {goog.net.XhrIo} */ (e.target);
alert(xhr.getResponseXml());
}, 'POST', data.toString(), {
'Accept' : 'text/xml'
});
Run Code Online (Sandbox Code Playgroud)
在后端使用导轨.
更新:
日志:
Processing BlogsController#create (for 127.0.0.1 at 2010-06-29 20:18:46) [PUT]
Parameters: {"authenticity_token"=>""}
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
Rendered rescues/_trace (272.4ms)
Rendered rescues/_request_and_response (1.2ms)
Rendering rescues/layout (unprocessable_entity)
Run Code Online (Sandbox Code Playgroud) 在rails 4 app的同一页面上我有一个
在脑袋里:
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="some_token" />
Run Code Online (Sandbox Code Playgroud)
在身体下面:
<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" />
Run Code Online (Sandbox Code Playgroud)
js调用需要csrf令牌.但为什么表单令牌与csrf令牌不同?表单提交中使用了哪两个令牌?
我正在修改 Rails 6 并且我不断在由 rails 生成的表单上获取 ActionController::InvalidAuthenticityToken,例如(实现 rails 教程书籍注册/登录流程)
<%= form_for(@user, url: 'signup') do |f| %>
<%= render 'partials/error_messages' %>
<%= f.label :name, "Nimi" %>
<%= f.text_field :name %>
<%= f.label :email, "E-mail" %>
<%= f.email_field :email %>
<%= f.label :password, "Parool" %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Korda parooli" %>
<%= f.password_field :password_confirmation %>
<%= f.submit "Loo konto", class: "button-green" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这发生在所有形式上,输出转储看起来像这样
应用程序.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Storebase - kaasaegsed e-poed!</title>
<%= csrf_meta_tags %> …Run Code Online (Sandbox Code Playgroud) ruby-on-rails csrf actioncontroller authenticity-token ruby-on-rails-6
我们在Rails 4.1应用程序中看到了一个不幸的,可能是基于浏览器的CSRF令牌真实性问题.我们在这里发布它是为了询问社区其他人是否也看到它.
请注意,大多数错误报告工具(如Honeybadger)会自动禁止ActionController :: InvalidAuthenticityToken,因此您通常不会在错误报告工具中看到问题,除非您不想看到它.
这是问题所在,这不是一个发展问题 - 这是一个尚未被诊断出来的生产问题.
我们看到的例外是在我们网站正常登录时的ActionController :: InvalidAuthenticityToken.仔细检查表单发送的authenticity_token和会话的_csrf_token(我们使用active_record_store作为我们的session_store设置),它们只是不匹配.经过直接检查,我可以断定它们是完全不同的代币,但我不知道为什么.
这不是一个简单的新手开发人员问题,请不要回答有关如何将CSRF令牌从客户端传递到服务器或如何在我的控制器上跳过伪造保护的基本答案.我不感兴趣听到任何一个有这两个答案的人:你不知道你在说什么,你不明白问题的深度和复杂性.我只对收听流量较高的网站的人有兴趣,他们可以确认这种情况发生在非无关紧要的访问者身上(奇怪的是,似乎比其他浏览器更频繁地影响某些浏览器.)
我们广泛地看到这个问题,可能约占我们高流量网站的1-2%.我只在生产中看到它,我无法在开发中重现它.
我在IE 11和Edge浏览器上看到的最多(你会注意到Rails 4.1在IE 11和Edge之前发布),但在Android上的Chrome上也是如此,偶尔也会在移动Safari上发布.
我们的Cache-control标头设置如下:
Cache-Control: max-age=0, private, must-revalidate
ruby-on-rails ×10
csrf ×4
forms ×2
ruby ×2
ajax ×1
caching ×1
javascript ×1
jquery ×1
rspec ×1