FuelPHPでCSRF対策

ウェブアプリケーションフレームワークFuelPHPにはSecurityパッケージにCSRF対策用の便利なツールが入っているので、 特にこだわりがなければ以下の点に注意して使っておくと良い。

  • 副作用のある操作でCSRF対策を施す
  • フォームへの埋め込みだけ施してpost先での検証を忘れないように注意(ありがち)
  • ログアウト処理には使わなくても害は無い
  • Configで十分に長く複雑なsaltを設定する

FuelでのCSRF対策機能の仕組み

Fuelのソースを確認した限りでは、以下のような仕組みのようだ。

  • fetch_tokenでCookieにcsrfのtokenの大元を生成&クライアント側にset
  • 大元のtokenはFuelサーバー内セッションストレージに保存される訳ではない
  • フォーム用としてsaltを付けてハッシュ化された値を生成、それをformのhiddenにセットすることを想定
  • クライアントがpostすると、hiddenのtokenの値と最初に生成した大元のtokenをrequest headerに含めて送信
  • Fuelサーバーはhiddenのtokenと、cookieで送信されたcsrfの大元の値にsalt付きハッシュを通した値を比較
  • 一致していればクライアントからの正当なリクエストと判定
  • saltはサーバー側でしか保持しないため、改ざんやリバース生成は事実上不可能
  • 大元token生成アルゴリズム(generate_tokenファンクション)に一部mt_randが使われているが、time(),uniqid(),salt,sha512を併用しているため実質的に安全であるものと思われる。
  • saltはクライアントごとに固有の値を持たせるのではなく、Fuelサーバーで共有されたものを一つだけ持つ

fetch_tokenの計算コストは無視でき、また、サーバー側ではhash前のtokenを保持しないのでかなり低コストである。


prev: 暗号化関連のメモ
next: PerlのOpenSSLモジュールで電子署名
created at : 2020-01-21 03:15:07
updated at : 2020-01-24 10:00:27
author : Toshiaki Yokoda