当前位置:  开发笔记 > 编程语言 > 正文

无法验证CSRF令牌真实性Rails 4.1

如何解决《无法验证CSRF令牌真实性Rails4.1》经验,为你挑选了2个好方法。

我正在开发一个简单的网站,让管理员创建问题,用户解决它们.我使用ActiveAdmin作为管理部分,使用简单的AJAX调用来解决部分用户问题.尝试通过ActiveAdmin :: Devise登录最初是成功的,但无法登出.我删除了所有cookie,从那以后,如果没有CSRF令牌真实性异常,我无法进行POST操作.我在application.html.erb的头部有正确的meta_tags,声明了jquery_ujs(其他线程说它是一个常见问题),在两个POST操作中都存在真实性令牌.我甚至试图通过skip_before_filter避免验证:verify_authenticity_token但ActiveAdmin登录和POST示例仍然失败.日志在下面,您可以看到令牌存在.我还展示了Gemfile,以防任何一个破坏CSRF的东西.

Rails版本[4.1.0]

Ruby版本[2.1]

Phusion Passenger Version [4.0.41]

提前致谢.

application.html.erb


  Introducción Matematicas
  <%= stylesheet_link_tag    "application", media: "all"%>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  
  <%= csrf_meta_tags %>


的application.js

//= require jquery
//= require jquery_ujs
//= require_tree ../../../vendor/assets/javascripts/.
//= require_tree .

应用控制器

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :null_session
  #skip_before_filter :verify_authenticity_token
  before_filter :configure_permitted_parameters, if: :devise_controller?
  protected
  def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) do |u|
        u.permit :name,:college, :email, :password, :password_confirmation
      end
  end
end

管理员登录日志

INFO -- : Processing by ActiveAdmin::Devise::SessionsController#create as HTML
INFO -- :   Parameters: {"utf8"=>"?", "authenticity_token"=>"aRZK3470X6+FJPANEuHAiwVW4NZwMzCkXtoZ1qlhQ0o=", "admin_user"=>{"email"=>"omar@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Login"}
WARN -- : Can't verify CSRF token authenticity
INFO -- : Completed 401 Unauthorized in 110ms
INFO -- : Processing by ActiveAdmin::Devise::SessionsController#new as HTML
INFO -- :   Parameters: {"utf8"=>"?", "authenticity_token"=>"aRZK3470X6+FJPANEuHAiwVW4NZwMzCkXtoZ1qlhQ0o=", "admin_user"=>{"email"=>"omar@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Login"}
WARN -- : Can't verify CSRF token authenticity
INFO -- :   Rendered vendor/cache/ruby/2.1.0/bundler/gems/active_admin-a460d8d2ab37/app/views/active_admin/devise/shared/_links.erb (2.0ms)
INFO -- :   Rendered vendor/cache/ruby/2.1.0/bundler/gems/active_admin-a460d8d2ab37/app/views/active_admin/devise/sessions/new.html.erb within layouts/active_admin_logged_out (73.0ms)
INFO -- : Completed 200 OK in 302ms (Views: 80.2ms | ActiveRecord: 0.0ms)

通过AJAX日志进行简单的POST

INFO -- : Processing by QuestionsController#check_question as JS
INFO -- :   Parameters: {"utf8"=>"?", "que_id"=>"44", "authenticity_token"=>"CjaAx+B36JPc1PUIhta0vIuOTKX4UhrFWlmYHAd+KWY=", "question"=>{"id"=>"169"}, "commit"=>"Verificar Respuesta", "id"=>"6"}
WARN -- : Can't verify CSRF token authenticity
INFO -- :   Rendered answers/_answer.html.erb (1.2ms)
INFO -- :   Rendered questions/check_question.js.erb (17.0ms)
INFO -- : Completed 200 OK in 94ms

的Gemfile

source 'https://rubygems.org'
gem 'rails', '4.1.0'
#gem 'ckeditor'
gem 'mysql2', "0.3.15"
gem 'devise'
gem 'activeadmin', github: 'gregbell/active_admin'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'execjs'
gem 'therubyracer'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
  gem 'sdoc', require: false
end
gem 'minitest'

jefflunt.. 10

skip_before_filter :verify_authenticity_token

哇,不要这样做.这是一个完全黑客攻击,如果你不小心将其留在代码中,你就会产生严重的安全问题.

那么,你为什么删除你的cookie?如果我正确地阅读了您的问题,那是因为您的注销功能被破坏了?你怎么知道为什么注销不工作而是修复它.可能不是一个好主意去创建另一个问题(绕过CSRF身份验证)而不是修复原始问题.

在此期间,重新启动本地开发服务器并在浏览器中启动新选项卡.看看是否会使CSRF的内容至少消失,然后再回到注销问题.



1> jefflunt..:

skip_before_filter :verify_authenticity_token

哇,不要这样做.这是一个完全黑客攻击,如果你不小心将其留在代码中,你就会产生严重的安全问题.

那么,你为什么删除你的cookie?如果我正确地阅读了您的问题,那是因为您的注销功能被破坏了?你怎么知道为什么注销不工作而是修复它.可能不是一个好主意去创建另一个问题(绕过CSRF身份验证)而不是修复原始问题.

在此期间,重新启动本地开发服务器并在浏览器中启动新选项卡.看看是否会使CSRF的内容至少消失,然后再回到注销问题.


我好像遇到了同样的问题.如果我已登录(设计),则没有错误.
我在ActiveAdmin登录时遇到了同样的问题,我在服务器上工作了几个月没有任何问题,突然间这成了一个问题,你有没有解决这个问题?

2> Nate Cheng..:

通常,从AJAX调用时会出现此问题.您可以简单地将令牌与帖子一起发送

headers : {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') // X-CSRF-TOKEN is used for Ruby on Rails Tokens
}

在你的ajax邮局中,确保你有

<%= csrf_meta_tags %>

在你的HTML中.

不要使用它

skip_before_filter :verify_authenticity_token

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有