ぽかぽかコード日和

とっても暑い夏の日にプログラミングはじめました☀️

【Security】CSRF(クロスサイト・リクエスト・フォージェリ)+Laravel実装

概要

Webアプリケーションのセッション管理に脆弱性があり、
ユーザーがログインした状態で攻撃者の罠リンクを踏むことで、
ユーザーの知らないうちに攻撃者がユーザーになりすまして、不正な操作を実行する攻撃手法。

  • Cookieによるセッション管理、Basic認証SSLクライアント認証を実装しているサイトは特に注意する。
    ネットバンキング、会員専用サイトなど金銭処理やログイン機能を持つもの。


発生しうる脅威
  • 個人情報の漏洩
    ユーザーの権限範囲内の情報しか閲覧できないが、
    パスワード変更などが成功した場合は、その後なりすまし攻撃につながる。

  • 金銭的被害
    不正送金やクレジットカードの不正利用、ECサイトで意図しない商品購入など

  • 登録情報の漏洩・改ざん
    各種設定の変更や退会処理、掲示板への不適切な書き込みなど

原因

Webアプリケーションが、
本来は拒否すべき他サイトからのリクエストを受信し処理してしまうこと。

対策

ログイン中のユーザーができる操作に対して対策をする。

根本的解決

1.CSRFトークンを発行する
  • リクエストが本当にユーザー本人の意思によるものかどうか確認する。
  • ユーザーの入力内容を確認する画面で、サーバーからCSRFトークンを発行しhiddenパラメータに出力する。
    フォーム送信するときにhiddenパラメータのトークンとサーバーに保持しているCSRFトークンを比較し、一致しないときは処理を中止する。
  • フォーム送信はPOSTメソッドでする。
2.処理の直前に再度パスワードを入力させる
  • 重要な操作の直前のページでユーザーに再度パスワードを入力させ、 そのパスワードが正しい場合のみ処理をする。
  • CSRFトークンより実装が簡単でコストも下がるが、画面設計の仕様変更が必要となる。
3.Refererをチェックする
  • Refererでそのリクエストが正しいサイトからか罠サイトからなのかを判別することができ、 正しいページのURLからのときのみ処理を実行する。

  • ユーザーがRefererを送信しない設定(ブラウザやファイアーウォール)にしているときは、 サイトを利用できないなど不都合が起きるので注意する。

保険的対策

4.登録済みのメールアドレスに自動送信する
  • CSRF攻撃自体は防げないが、攻撃されたときに利用者が異変に気づくきっかけになる。
  • メール本文にはプライバシーに関わる重要な情報は書かない。

Laravelでの実装例

1.フォームに@csrfと書いてトークンを発行する

ビューのblade.phpファイルに

<form method="post" action="{{ route('ルーティング先') }}">
    @csrf
    処理内容
</form>

☀︎「@csrf」と書くだけでCSRFトークンが生成され、フォームへ埋め込まれトークンの検証までしてくれる。

2.デフォルトでミドルウェア機能が搭載

Laravelでは「VerifyCsrfToken」ミドルウェアがデフォルトで有効なので、
「@csrf」と書くだけで追加の作業は不要。


参考にしたサイト