200

新しい Rails 4 アプリ (Ruby 2.0.0-p0 上) に取り組んでいたとき、いくつかの認証トークンの問題に遭遇しました。

respond_to(クラス メソッドを使用して) json に応答するコントローラーcreateActionController::InvalidAuthenticityToken作成しているときに、curl.

設定したことを確認し-H "Content-Type: application/json"、データを設定しまし-d "<my data here>"たが、まだ運がありません。

Rails 3.2 (Ruby 1.9.3) を使用して同じコントローラーを作成しようとしましたが、認証トークンの問題はまったくありませんでした。いろいろ調べたところ、Rails 4 の真正性トークンにいくつかの変更があったことがわかりました。私が理解していることから、フォームに自動的に挿入されなくなりましたか? これは何らかの形で非 HTML コンテンツ タイプに影響を与えていると思います。

HTML フォームを要求し、認証トークンを取得してから、そのトークンを使用して別の要求を行うことなく、これを回避する方法はありますか? それとも、完全に明白な何かを完全に見逃していますか?

編集:何も変更せずに足場を使用して新しいRails 4アプリで新しいレコードを作成しようとしましたが、同じ問題が発生しているので、私がしたことではないと思います。

4

13 に答える 13

73

csrf 保護をオフにする代わりに、次のコード行をフォームに追加することをお勧めします。

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 

form_for または form_tag を使用してフォームを生成している場合、上記のコード行がフォームに自動的に追加されます。

于 2013-09-29T15:05:30.200 に答える
71

次の行をフォームに追加するとうまくいきました:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
于 2013-10-25T08:36:33.843 に答える
33

API を排他的に実装しない限り、CSRF 保護を一般的にオフにするのは良くないと思います。

ActionControllerの Rails 4 API ドキュメントを見ると、コントローラごとまたはメソッド ベースごとに偽造保護をオフにできることがわかりました。

たとえば、使用できるメソッドの CSRF 保護をオフにするには

class FooController < ApplicationController
  protect_from_forgery except: :index
于 2013-08-07T05:44:37.870 に答える
5

この公式ドキュメント - API の偽造防止を適切に無効にする方法について説明しています http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

于 2015-11-19T22:28:35.213 に答える
2

これらの機能は、セキュリティと偽造防止の目的で追加されました。
ただし、質問に答えるために、いくつかの入力を示します。コントローラー名の後にこれらの行を追加できます。

そのようです、

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

以下は、さまざまなバージョンのレールの行です。

レール3

skip_before_filter :verify_authenticity_token

レール 4 :

skip_before_action :verify_authenticity_token


すべてのコントローラ ルーチンに対してこのセキュリティ機能を無効にする場合は、application_controller.rb ファイルでprotect_from_forgeryの値を:null_sessionに変更できます。

そのようです、

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end
于 2016-12-19T10:07:35.357 に答える
0

独自の html フォームを定義するときは、セキュリティ上の理由からコントローラーに送信する必要がある認証トークン文字列を含める必要があります。Railsフォームヘルパーを使用して認証トークンを生成すると、次のようにフォームに追加されます。

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
  </div>
    ...
</form>

したがって、問題の解決策は、セキュリティなどを犠牲にするのではなく、authenticity_token フィールドを追加するか、Rails フォーム ヘルパーを使用することです。

于 2014-07-06T12:10:39.357 に答える