ECのウェブ担当者のメモ

ECサイトを運営管理している、WEB担当プログラマのメモ

スポンサーリンク

ActionController::InvalidCrossOriginRequestが発生した時の対策

f:id:jun9632:20171130231253p:plain

Ruby on RailsでActionController::InvalidCrossOriginRequestが発生した時の対策です。

なぜInvalidCrossOriginRequestが発生するのか?

大半が、Ruby on Rails が行ってくれている、CSRF(クロスサイトリクエストフォージェリ)対策に引っかかっているからだと思います。

CSRF(クロスサイトリクエストフォージェリ)については、下記のwikiを参照ください。

クロスサイトリクエストフォージェリ - Wikipedia

その、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

そして、基本的に通常の入力フォームがある場合のアクションには設定しない。

無理せずなるべく安全に行きましょう!

関連記事

marketing-web.hatenablog.com

marketing-web.hatenablog.com