web-dev-qa-db-fra.com

Impossible de vérifier l'authenticité du jeton CSRF Rails 4.1

Je développe un site simple qui permet aux administrateurs de créer des questions et aux utilisateurs de les résoudre. J'utilise ActiveAdmin pour la partie admin et de simples AJAX appels pour la partie résolution de l'utilisateur. La tentative de connexion via ActiveAdmin :: Devise a été un succès, mais la connexion n’a pas été possible. J'ai supprimé tous les cookies et depuis lors, je ne suis plus en mesure d'effectuer d'actions POST sans exception d'authenticité de jeton CSRF. J'ai les méta_tags corrects dans la tête de mon application.html.erb, a déclaré jquery_ujs (d'autres threads disent que c'est un problème commun) et dans les deux POST actions, le jeton d'authenticité existe. J'ai essayé même d'éviter la vérification via skip_before_filter: verify_authenticity_token mais le login ActiveAdmin et l'exemple POST continuent à échouer. Les journaux sont en dessous, vous pouvez voir que les jetons existent. Je montre également le Gemfile au cas où l’un de ceux-ci casse quelque chose avec le CSRF.

  • Version Rails [4.1.0] 
  • Version Ruby [2.1]
  • Phusion Passenger Version [4.0.41]

Merci d'avance.

application.html.erb

<head>
  <title>Introducción Matematicas</title>
  <%= stylesheet_link_tag    "application", media: "all"%>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <link href="http://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700|Roboto+Slab:300,400" rel="stylesheet" type="text/css">
  <%= csrf_meta_tags %>
</head>

application.js

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

Contrôleur d'application

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

Journal de connexion de l'administrateur

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)

Simple POST via AJAX Journal

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'
11
torresomar

skip_before_filter :verify_authenticity_token

Whoa, ne fais pas ça. C'est un piratage total, et si vous laissez cela dans votre code accidentellement, vous venez de créer un grave problème de sécurité.

Alors, pourquoi avez-vous supprimé vos cookies? Si je lis correctement votre question, c'est parce que votre fonction de déconnexion a été interrompue? Pourquoi ne pas découvrir pourquoi la déconnexion ne fonctionne pas et résoudre le problème à la place. Ce n’est probablement pas une bonne idée de créer un autre problème (en contournant l’authentification CSRF) au lieu de résoudre le problème initial.

En attendant, redémarrez le serveur de développement local et démarrez un nouvel onglet dans votre navigateur. Voir si cela fait au moins disparaître le contenu de la CSRF, puis revenez au problème de la déconnexion.

10
jefflunt

Habituellement, vous rencontrez ce problème lorsque vous appelez AJAX. Vous pouvez simplement mettre à envoyer le jeton avec le message

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

dans votre appel ajax post, et assurez-vous que vous avez

<%= csrf_meta_tags %>

dans votre HTML.

Ne l'utilisez jamais

skip_before_filter :verify_authenticity_token
5
Nate Cheng

Ajoutez simplement le joyau ci-dessous https://github.com/jsanders/angular_Rails_csrf il prendra du reste 

0
Muaaz Rafi