4

Railsの初心者を助けてください:)クラスprotect_from_forgeryに属性のない呼び出し(デフォルトで指定)があります。ApplicationController

基本的にコードは次のとおりです。

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  protect_from_forgery
  helper_method :current_user_session, :current_user
  filter_parameter_logging :password, :password_confirmation

私がすべきだと思うのは、正しいのない POST リクエストを防ぐ必要があるということですauthenticity_token。しかし、以下のような jQuery でポスト リクエストを送信すると、正常に動作します (データベースで実行される update ステートメントがあります)。

$.post($(this).attr("href"), { _method: "PUT", data: { test: true } });

送信されたパラメーターの中にないことがコンソールに表示さauthenticity_tokenれますが、リクエストは引き続き有効と見なされます。何故ですか?

UPD config/environments/development.rb で構成設定が見つかりました

config.action_controller.consider_all_requests_local = true

DEV 環境とローカル リクエストにより、これらの jQuery ポスト リクエストは問題ありませんでした。

4

2 に答える 2

2

$.post($(this).attr("href"), { _method: "PUT", data: { test: true } });リクエストがアプリ自体から実行される限り、コードに問題はありません。たとえば localhost:3001 など、他の場所で別のアプリを実行していて、そこから投稿を送信した場合、それは機能しません。実際、firefox > 3.0 を使用している場合、クロスサイト xhr の初期実装も含まれています。たとえば、他のどのサイトからでも POST を送信できます (ただし、これは、protect_from_forgery がオフになっている場合に機能します!)。xhr に認証トークンが不要な理由は、クロスサイト xhr が無効になっているためです。そのため、認証トークンを提供せずに xhr を使用しても安全です。アプリ以外の場所から試してみると、認証トークンを要求する例外が発生すると確信しています。また、外部ソースからのアクセスを防ぐために crossdomain.xml を定義する必要があります。

これを試してください: curl -X -d url_endpoint_of_your_app. 200 応答コードを取得するかどうかを確認します。もしそうなら、何か怪しいものがあります。

于 2010-04-28T00:01:48.800 に答える
-1

ばかげた質問かもしれませんが、ApplicationController をサブクラス化していますか? 路線図はどうなっていますか?また、Rails のバージョンは何ですか (わかりやすくするため)。

jQuery からの呼び出しが実際には GET ではなく POST であることを確認しましたか? (私は知っています、それは明らかなようです)。Rails は、非 GET リクエストに対してのみ保護を実行します。

また、送信されるリクエストのコンテンツ タイプは何ですか。ドキュメントによると、Rails はHTML/Javascript リクエストの場合にのみ保護を実行します。

于 2010-04-27T21:22:04.710 に答える