2011-07-05 7 views
2

私は(Railsのに3.0.9を使用して)新しいRailsアプリケーションを作成し、以下のように足場の迅速なビットをノックした場合:CSRFがRailsで動作していませんか?

$ rails new testing 
$ rails g scaffold thing name:string 

次にアプリ/コントローラ/ application_controller.rbはデフォルトで「protect_from_forgery」が含まれていしたがって、POST作成時にauthenticity_tokenをチェックする必要があります。少なくとも、それは私の理解です。

なぜ、この行は、トークンを提供せずに、新しいThingを正常に作成しますか?

$ curl -F "thing[name]=abc123" http://localhost:3000/things 

ログエントリは言う:私もレコードを削除するには、この操作を行うことができ

Started POST "/things" for 127.0.0.1 at 2011-07-05 08:29:18 +0100 
    Processing by ThingsController#create as 
    Parameters: {"thing"=>{"name"=>"abc123"}} 
    AREL (0.3ms) INSERT INTO "things" ("name", "created_at", "updated_at") VALUES ('abc123', '2011-07-05 07:29:18.484457', '2011-07-05 07:29:18.484457') 
Redirected to http://localhost:3000/things/18 
Completed 302 Found in 89ms 

$ curl -X DELETE http://localhost:3000/things/18 

同じことが、生産モードで起こります。これは私のアプリケーションをCSRFに開放していないのですか?

+0

セッションIDに基づいてユーザーを認証していますか? – polarblau

答えて

1

無効なCSRFトークンを渡したり、それを使わずにリクエストを送信した場合、Railsはセッションを無効にするので、誰でもアプリケーションにアクセスできる場合はprotect_form_forgeryは役に立たなくなります。 しかし、セッションベースの認証システムを使用している場合は、アプリケーションをCSRF攻撃から保護します。

詳細情報:How does Rails CSRF protection work?

+0

認証にhttp basicを使用したいのであれば、protect_from_forgeryは私を保護しませんか?以前のバージョンでは、トークンがより積極的にチェックされていたことを覚えているようです。 – SteveP

+0

@SteveP:私はそれをテストしました。あなたはHTTP Basic Authを使うとき、 'protect_form_forgery'があなたを保護しないようです。なぜなら、それは意味をなさないからです。 – BitOfUniverse

+0

ログインした場合(httpを基本とする)、後で

などのフォームを含むリモートサイトを参照してください。トークンがチェックされていれば、それは脅威ではありません。ちなみに、コントローラの作成、更新、削除メソッドに "verify_authenticity_token"を追加することで、私が望む動作を得ることができます。ちょうどそれがデフォルトではないことに驚いています。 – SteveP

関連する問題