web-dev-qa-db-ja.com

CSRFトークンの信頼性を確認できませんRails 4.1

私は、管理者が質問を作成し、ユーザーが質問を解決できるシンプルなサイトを開発しています。私は管理部にActiveAdminを使用し、単純なAJAX呼び出しはユーザー解決部を呼び出します。最初はActiveAdmin :: Deviseを介してログインしようとしましたが、ログインはできませんでした。すべてのCookieを消去し、それ以来、POSTアクションをCSRFトークン認証例外なしで実行することはできません。application.html.erbのヘッド内に正しいmeta_tagsがあり、jquery_ujsを宣言しました(他のスレッドは、共通の問題)とPOSTアクションの両方で認証トークンが存在します。skip_before_filter:verify_authenticity_tokenによる検証を回避しようとしましたしかし、ActiveAdminログインとPOSTの例は失敗し続けます。ログは次のとおりです。トークンが存在することがわかります。また、CSRFで何かが壊れている場合に備えて、Gemfileも表示します。

  • Railsバージョン[4.1.0]
  • Rubyバージョン[2.1]
  • Phusion Passengerバージョン[4.0.41]

前もって感謝します。

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 .

アプリケーションコントローラ

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"=>"[email protected]", "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"=>"[email protected]", "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)

シンプルPOST via AJAX Log

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、これを行わないでください。これは完全なハックであり、誤ってコードに残しておくと、深刻なセキュリティ問題が発生します。

では、なぜCookieを削除したのですか?私があなたの質問を正しく読んだ場合、それはあなたのログアウト機能が壊れていたからですか?ログアウトが機能しない理由を見つけて、代わりに修正してください。元の問題を修正するのではなく、別の問題を作成して(CSRF認証を回避して)作成することはおそらくお勧めできません。

それまでの間、ローカル開発サーバーを再起動し、ブラウザで新しいタブを開始します。それにより、CSRFの要素が少なくともなくなるかどうかを確認し、ログアウトの問題に戻ります。

10
jefflunt

通常、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
5
Nate Cheng

以下のgemを追加するだけです https://github.com/jsanders/angular_Rails_csrf あとは残ります。

0
Muaaz Rafi