[解決済み】Railsの認証トークンを理解する
質問
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 リクエストがべき乗であることについて。彼は私がここで説明したよりも良い方法でそれを説明しています。
関連
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み] Railsです。gemを使った特定バージョンのライブラリのアンインストール
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rails 3.1 を使用して、「ページ固有」の JavaScript コードをどこに置くか?
-
[解決済み] Railsのアセットパイプラインでフォントを使用する
-
[解決済み】RailsでOOデザイン。どこにものを置くか
-
[解決済み】Rails 4 認証トークン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] heroku open - no app specified
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み】X-Requested-Withヘッダーのポイントは何でしょうか?