webネタ

技術系ブログ。web系SE。1988。♂。@rhong_

有名フレームワークのCSRF対策方法を調べたまとめ

ZendFramework

流れ

  • 表示時 : token生成→hiddenセット + セッションにセット
  • 送信時 : 送られてきたtokenをセッションにあるものと同じかでチェック

token生成方法

ランダム値 + salt + 固定値 + ランダム値

md5(
 	mt_rand(1,1000000)
 	.  $this->getSalt()
 	.  $this->getName()
 	.  mt_rand(1,1000000)
);

まとめ

ランダム値をセッションにいれて、送られてきたものとチェック。

Symfony

流れ

  • 表示時 : token生成→hiddenセット
  • 送信時 : 送られてきたtokenを、再度生成したtokenと比較して同じかチェック

token生成方法

salt + 固定値 + セッションID

sha1($this->secret.$intention.$this->getSessionId());

まとめ

なるほどセッションID使うのか。

cakephp

流れ

  • 表示時 : token生成→hiddenセット + セッションにセット
  • 送信時 : 送られてきたtokenをセッションにあるものと同じかでチェック。有効期限設定可。

token生成方法

salt + ランダム値

sha1(Configure::read('Security.salt') . $uuid)

まとめ

ランダム値をセッションにいれて、送られてきたものとチェック。

fuelphp

流れ

  • 表示時 : token生成→hiddenセット + クッキーにセット
  • 送信時 : 送られてきたtokenをクッキーにあるものと同じかでチェック。有効期限設定可(=クッキーの有効期限)。

token生成方法

salt + ランダム値

md5(uniqid().time())

まとめ

jsにも対応してるのでjsでクッキー書いたりしたいからクッキー使ってるみたい。

ruby on rails

流れ

  • 表示時 : token生成→hiddenセット + セッションにセット
  • 送信時 : 送られてきたtokenをセッションにあるものと同じかでチェック

token生成方法

ランダムな base64 文字列

SecureRandom.base64(32)

まとめ

ランダム値をセッションにいれて、送られてきたものとチェック。

結論

あいだをとって

  • ランダム値をセッションにいれて、送られてきたものとチェック
  • 有効期限チェック
  • salt + shha1で生成

が一番よさそう。つまりcakeのが一番よさそう。