Shikata Ga Nai

Private? There is no such things.

CSRFトークンとは?サーバーと連携してCSRF攻撃を防ぐ最重要防御機構

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, (^^ゞ