3

重複の可能性:
警告: CSRF トークンの信頼性レールを検証できません

JQuery AJAX を使用して DELETE HTTP 要求を送信します。URL (/myitems/1234) はログアウト URL (/users/sign_out) とは異なりますが、リクエスト後にユーザー セッションが破棄されていることがわかりました。

私は Devise authentication gem を使用しています。

ログは次のとおりです。

Started DELETE "/myitems/2538" for 127.0.0.1 at 2012-06-26 19:09:49 +0400
Processing by MyItemsController#destroy as */*
  Parameters: {"id"=>"2538"}
WARNING: Can't verify CSRF token authenticity
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 6 LIMIT 1
   (0.0ms)  BEGIN
   (0.0ms)  UPDATE "users" SET "remember_token" = NULL,
            "remember_created_at" = NULL,
            "updated_at" = '2012-06-26 15:09:49.055774'
            WHERE "users"."id" = 6
   (1.0ms)  COMMIT
Completed 401 Unauthorized in 7ms

routes.rb には次の行が含まれています。

resources :myitems

myitems に関することはこれ以上ありません。

コントローラーの削除用コード:

def destroy
   puts 'delete'
end

アップデート

POST リクエストでも同じことが起こります。

4

1 に答える 1

2

問題 (@Thilo のコメントで示唆されているように) は、AJAX リクエストに CSRF トークンが含まれていないことです。Rails のデフォルトの動作は、CSRF トークンが一致しない場合にセッションをクリアすることです。これが、セッションが削除されている理由です。

ソリューション:

1) AJAX リクエストで CSRF トークンを渡します。必要に応じて、Rails の UJS コードを利用して、適切な CSRF ヘッダーを自動的に追加できる場合があります。

2) 特定のコントローラー アクションの認証トークン検証をスキップしますが、セキュリティに悪影響を及ぼす可能性があります。

今は時間がないので、他の人が改善できるように、これをコミュニティ wiki としてマークしています。

于 2012-06-26T16:07:33.907 に答える