1. ホーム
  2. ruby-on-rails

[解決済み】Railsの認証トークンを理解する

2022-03-23 04:38:23

質問

RailsのAuthenticity Tokenについて、いくつかの問題に遭遇しています。

Authenticity トークンを理解したいのですが。

このテーマについて完全な情報源をお持ちですか、それともここで時間をかけて詳しく説明していただけますか?

解決方法は?

何が起こるか

ユーザーがリソースを作成、更新、破棄するためのフォームを表示すると、Railsアプリはランダムな authenticity_token このトークンをセッションに保存し、フォームの隠しフィールドに格納します。ユーザーがフォームを送信すると、Railsはこのトークンを探して authenticity_token と比較し、一致すればリクエストの続行が許可されます。

なぜ起こるのか

認証トークンはセッションに保存されるため、クライアントはその値を知ることができません。このため、Railsアプリにフォームを送信する際に、そのアプリ内でフォームを表示することなく送信することができません。 サービスAを利用していて、サービスにログインし、すべてがうまくいっているとします。次に、サービスBを使おうとしたとき、気に入った写真があって、その写真を押して大きなサイズで表示したとします。ここで、サービスBに邪悪なコードがいた場合、(あなたがログインしている)サービスAにリクエストを送り、あなたのアカウントを削除するように要求するかもしれません。 http://serviceA.com/close_account . これは、いわゆる CSRF(クロスサイトリクエストフォージェリ) .

サービスAが認証トークンを使用している場合、サービスBからのリクエストは正しい認証トークンを含んでいないため、この攻撃ベクトルはもはや適用されず、継続が許可されません。

APIドキュメント は、metaタグの詳細を記述しています。

<ブロッククオート

CSRF保護機能をオンにするのは protect_from_forgery メソッドを使用します。 トークンをチェックし、一致しない場合はセッションをリセットします。 が期待される。このメソッドの呼び出しは、新しいRails アプリケーションをデフォルトで作成します。 トークンのパラメータは authenticity_token はデフォルトで この名前 をレンダリングするすべてのレイアウトに、このトークンの値を追加する必要があります。 を含めることで、フォームを作成することができます。 csrf_meta_tags をHTMLの先頭に記述する。

備考

Railsはべき乗でないメソッド(POST, PUT/PATCH, DELETE)のみを検証することに留意してください。GETリクエストは認証トークンをチェックしません。なぜかというと、HTTPの仕様では、GETリクエストはidempotentであり、以下のようにする必要があるからです。 ではない サーバーのリソースを作成、変更、破棄し、リクエストは冪等であるべきです(同じコマンドを複数回実行した場合、毎回同じ結果が得られるはずです)。

また、実際の実装は冒頭で定義したようにもう少し複雑で、より良いセキュリティを確保するためのものです。Railsは、すべてのフォームで同じストアドトークンを発行するわけではありません。また、毎回異なるトークンを生成して保存するわけでもありません。暗号ハッシュを生成してセッションに保存し、ページがレンダリングされるたびに新しい暗号トークンを発行して、保存されたものと照合することができるのです。参照 request_forgery_protection.rb .

レッスン内容

使用方法 authenticity_token を使用して、べき乗ではないメソッド (POST, PUT/PATCH, および DELETE) を保護します。また、サーバー上のリソースを変更する可能性のあるGETリクエストは許可しないようにしましょう。


EDITです。 チェック erturne さんのコメント GET リクエストがべき乗であることについて。彼は私がここで説明したよりも良い方法でそれを説明しています。