クロスサイトリクエストフォージェリ対策 (CSRF)
まず基本的に、GET と POST を適切に使い分ける必要がある。
GET を使うべき場面
- そのやりとりが基本的に問い合わせ (question) である場合 (クエリ、読み出し操作、検索のような安全な操作)
POST を使うべき場面
- そのやりとりが基本的に命令 (order) である場合
- そのやりとりによってリソースの状態が変わり、そのことがユーザーにわかる場合 (サービスへの申し込みなど)
- そのやりとりによって生じる結果に対してユーザーが責任を持つ場合
偽造リクエストを防止するために、必須セキュリティトークン (required security token) を導入する。アプリケーションコントローラはデフォルトで次のコードを含む。
protect_from_forgery with: :exception
偽造リクエストに対してクッキーを消去する必要がある場合は、次のコードを使う。
rescue_from ActionController::InvalidAuthenticityToken do |exception| # ユーザーのログイン情報 (cookie) を削除する sign_out_user end
参考:
クロスサイトリクエストフォージェリ (CSRF) | Rails ガイド [公式]
Rails の CSRF 周りのコードリーディング | freedom-man
Rails の CSRF 保護を詳しく調べてみた 翻訳 | TechRacho
A Deep Dive into CSRF Protection in Rails | Ruby Inside
Securing Rails Applications | Ruby on Rails Guides [Official]
per_form_csrf_tokens
参考:
フォームごとに異なる CSRF トークンを受け取れるようになった 翻訳 | TechRacho
InvalidAuthenticityToken エラー
参考:
Rails で CSRF トークン検証エラーが出ることがある | 覚え書き
Rails の CSRF 対策の仕組みについて | odaillyjp blog
Rails の InvalidAuthenticityToken 対応 – Qiita
Ajax リクエスト時に CSRF トークンを送る
jquery-ujs もしくは rails-ujs を使うと、AJAX リクエストの際に自動的に CSRF トークンが送信される。
参考:
Ajax で POST すると「Can’t verify CSRF token authenticity.」が発生する – Qiita
今さら jquery-rails が csrf トークンをいい感じにしてくれていたことを知った | パパエンジニアのアウトプット帳
rails-ujs に見る、jQuery からの移行法 – Qiita
Rails5 の勉強会をした話と rails-ujs で remote: true なフォームを JS からサブミットさせようとしたらうまくいかなかった話 | Rista Tech Blog
jquery-ujs.js (rails.js) 便利だよって話 – GitHub Gist
Vue.js と Rails の最適な融合を考える | メドピア開発者ブログ
Rails + React axios で通信 ~CSRF トークンの設定~ | 開発メモメモブログ
CSRF の対応について、rails 使いが知っておくべきこと | おもしろ web サービス開発日記
Rails で CSRF を無効にせずに Ajax から REST な API を叩く | KazumaLab.
Rails での CSRF 対策避け | DesignAssembler
外部から POST できない? Rails の CSRF 対策をまとめてみた – Qiita
Sending POST requests in Rails 5.1 without jQuery | Actualize
How to get jQuery to work with Rail’s Authenticity Token (protect_from_forgery) – GitHub Gist
Set the CSRF token for Rails when doing Ajax requests – GitHub Gist
Can’t verify CSRF token authenticity when making a POST request – Stack Overflow
Nignx でリバースプロキシする
参考: