概要
Webアプリケーションのセッション管理に脆弱性があり、
ユーザーがログインした状態で攻撃者の罠リンクを踏むことで、
ユーザーの知らないうちに攻撃者がユーザーになりすまして、不正な操作を実行する攻撃手法。
発生しうる脅威
個人情報の漏洩
ユーザーの権限範囲内の情報しか閲覧できないが、
パスワード変更などが成功した場合は、その後なりすまし攻撃につながる。金銭的被害
不正送金やクレジットカードの不正利用、ECサイトで意図しない商品購入など登録情報の漏洩・改ざん
各種設定の変更や退会処理、掲示板への不適切な書き込みなど
原因
Webアプリケーションが、
本来は拒否すべき他サイトからのリクエストを受信し処理してしまうこと。
対策
ログイン中のユーザーができる操作に対して対策をする。
根本的解決
1.CSRFトークンを発行する
- リクエストが本当にユーザー本人の意思によるものかどうか確認する。
- ユーザーの入力内容を確認する画面で、サーバーからCSRFトークンを発行しhiddenパラメータに出力する。
フォーム送信するときにhiddenパラメータのトークンとサーバーに保持しているCSRFトークンを比較し、一致しないときは処理を中止する。 - フォーム送信はPOSTメソッドでする。
2.処理の直前に再度パスワードを入力させる
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」と書くだけで追加の作業は不要。