Hello there, ('ω')ノ
✅ CSRFトークンとは?
CSRFトークン(Cross-Site Request Forgery Token) とは:
- 一意(unique)
- 秘密(secret)
- 予測不能(unpredictable)
な値であり、サーバー側で生成し、クライアントに渡される「検証用の鍵」です。
🎯 目的:リクエストが本物のユーザーからのものかどうかを検証する
CSRFトークンがリクエストに含まれていない、あるいは一致しない場合、 サーバーはリクエストを不正と判断し、処理を拒否します。
✅ フォームにおけるCSRFトークンの利用例
<form name="change-email-form" action="/my-account/change-email" method="POST"> <label>Email</label> <input required type="email" name="email" value="example@normal-website.com"> <input required type="hidden" name="csrf" value="50FaWgdOhi9M9wyna8taR1k3ODOR8d6u"> <button class='button' type='submit'> Update email </button> </form>
csrf
という名前の hiddenフィールド に、サーバーから生成されたトークンが含まれている- フォーム送信時にこのトークンも一緒に送信される
- サーバー側はその値をセッション情報と照合し、正しい値であることを確認する
✅ なぜCSRFトークンは効果的なのか?
理由 | 説明 |
---|---|
攻撃者はこの値を知ることができない | トークンはHTML内にのみ埋め込まれ、他ドメインのJavaScriptではアクセス不可 |
毎回ランダム or ユーザーごとに異なる | 再利用や推測が困難 |
リクエストの改ざんを即座にブロック | トークンが一致しなければ処理されないため、安全性が高い |
✅ CSRFトークンの実装方法(開発者向け)
ステップ | 内容 |
---|---|
サーバーでトークンを生成 | セッションIDと関連付けて保存(例:session.csrf_token ) |
HTMLに埋め込む | フォームのhiddenフィールドやJavaScriptで読み込ませる |
サーバーで受信時に検証 | POSTリクエストの中にあるトークン値とセッション保存値を比較 |
⚠️ 実装時の注意点
問題 | 説明 |
---|---|
トークンを生成していない | 一見フォームがあるだけで防御になっていないケースが多い |
トークンを検証していない | 入っているだけで何もチェックしないという重大実装ミスも多い |
トークンがURLに含まれている | ログやRefererで漏洩するリスクあり → POSTで送るべき |
✅ まとめ
CSRFトークンは「あなたが本当に本人か?」を確かめるチェックキーです。
- ユーザーのセッションに対応する安全なリクエストかどうかを判断する
- 攻撃者がトークンを得る手段はなく、CSRF攻撃を根本から防ぐことができる
Best regards, (^^ゞ