[解決済み] Rails CSRF Protection + Angular.js: protect_from_forgery で POST でログアウトする。
2022-07-07 14:01:18
質問
もし
protect_from_forgery
オプションがapplication_controllerに記述されている場合、ログインして任意のGETリクエストを実行できますが、最初のPOSTリクエストでRailsはセッションをリセットし、私をログアウトさせるのです。
私は
protect_from_forgery
オプションを一時的にオフにしましたが、Angular.jsで使用したいと思います。何か方法があるのでしょうか?
どのように解決するのですか?
DOMからCSRF-valueを読み取るのは良い解決策ではなく、あくまで回避策だと思います。
angularJSの公式サイトにこんな文書がありました。 http://docs.angularjs.org/api/ng.$http :
あなたのドメインで動作するJavaScriptだけがクッキーを読むことができるので、あなたのサーバーはXHRがあなたのドメインで動作するJavaScriptから来たものであることを保証することができるのです。
この機能(CSRF保護)を利用するために、サーバーはJavaScriptが読み取り可能なセッション XSRF-TOKENと呼ばれるクッキーにトークンを設定する必要があります。その後の GET 以降のリクエストでは、サーバーはそのクッキーが X-XSRF-TOKEN HTTPヘッダー
以下は、これらの指示に基づく私の解決策です。
まず、Cookieを設定します。
# app/controllers/application_controller.rb
# Turn on request forgery protection
protect_from_forgery
after_action :set_csrf_cookie
def set_csrf_cookie
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
次に、GET以外のリクエストのたびにトークンを検証する必要があります。
Railsにはすでに同様のメソッドが構築されているので、それをオーバーライドしてロジックを追加すればよいのです。
# app/controllers/application_controller.rb
protected
# In Rails 4.2 and above
def verified_request?
super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
end
# In Rails 4.1 and below
def verified_request?
super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
end
関連
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] Paramが無いか、値が空である。ParameterMissing in ResultsController#update
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】警告:CSRFトークンの真正性を確認できない rails
-
[解決済み】AjaxのPOSTリクエストでDjangoのCSRFチェックが失敗する件
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] rails consoleを起動するとRailsのイニシャライザーが呼ばれる?
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".