クロスサイトリクエストフォージェリ(CSRF)

攻撃対象のwebアプリケーションに意図しないリクエストを送信させる。

攻撃手法

攻撃用のwebページや掲示板やメールに、標的のユーザーがログイン中の標的アプリに無意識にリクエストを送らせるコードやリンクを仕込む。

  • ブラウザはリクエストのたびにcookieを自動的にドメインに送信するが、異なるドメインに属するサイトからリクエストがあった場合(SNSに投稿されたリンクをクリックするなど)にもブラウザがcookieを送信してしまう
  • つまりリンク先の標的アプリのセッションがタイムアウトしていない場合、リクエストが勝手に送られてしまう

Railsでの対策

リクエストヘッダーにトークンを仕込む
protect_from_forgery with: :exception
# このコードがあると、Railsで生成されるすべてのフォームとAjaxリクエストにセキュリティトークンが自動的に含まれます。
# セキュリティトークンがマッチしない場合には例外がスローされます
protect_from_forgery with: :null_session
# トークンが一致しない場合セッションを空にする
  • form_withやform_forなどのヘルパーを使うと、自動でセキュリティトークン(authenticity_token)を仕込んでくれる。
  • Railsにデフォルトで含まれるunobtrusive scripting adapterが追加するX-CSRF-Tokenというヘッダーには、GET以外のあらゆるAjax呼び出しでセキュリティトークンを含んでいる。