ActionController::InvalidCrossOriginRequestが発生した時の対策
Ruby on RailsでActionController::InvalidCrossOriginRequestが発生した時の対策です。
なぜInvalidCrossOriginRequestが発生するのか?
大半が、Ruby on Rails が行ってくれている、CSRF(クロスサイトリクエストフォージェリ)対策に引っかかっているからだと思います。
CSRF(クロスサイトリクエストフォージェリ)については、下記のwikiを参照ください。
その、CSRF対策として、RailsがフォームやらAjaxやらで、トークンを発行して認証までしてくれています。 ほとんどの場合、何も気にすることなく、勝手に認証されているのではないでしょうか。
その、認証に失敗した場合に、InvalidCrossOriginRequestが発生します。
対処方法
CSRF 対策を全アクションで無効にする
コントローラーに下記を追加します
protect_from_forgery with: :exception
追加した、コントローラーの全ての認証処理をパスしてくれます。
この書き方は、とても注意が必要だと思います。本当にCSRF対策が必要無いのかを必ず確認してください。 入力フォームがあって、サブミットするようなアクションがある場合は避けた方が良いと思います。
CSRF 対策を一部のアクションで無効にする
コントローラーに下記を追加します
protect_from_forgery except: :index
こうすることで、indexアクションだけ、CSRF 対策をスキップしてくれます。 create や updateアクションでは、認証処理をしてくれます。
まとめ
個人的には、データを取得するために AjaxのFormを作った時に、リクエスト先のアクションに protect_from_forgeryを設定することがよくあります。
下記のようなフォームです。
= form_tag xxxx_paht, method: :get, remote: true
そして、基本的に通常の入力フォームがある場合のアクションには設定しない。
無理せずなるべく安全に行きましょう!
関連記事
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る