こんなtokenのつくりかたは嫌だ

たぶんCSRFの対策なんだろうけど、対策になっていないコードをみつけた。
こういうことはしてはいけませんよ!というメモ。
記述はCakePHPを対象にしています。

※実際にみたコードではuser_idをGETで送ったりはしてません。

$tokenの作り方がまずい。
$tokenの元になっている
– $session_idは再ログイン(もしくはセッションが時間で切れる)しない限り永遠に同じ値。
– $saltは固定。
というものになっている。
つまり、$session_idが変わらない限り$tokenも変わらないということになる。

確かにindexで2回以上ボーナスがもらえないようにgotBonus()で確認しているが、receiveでは確認していないという・・・。
つまり、
>http://hoge.com/bonus/receive/?user_id=xxxx&token=$token
このURLさえつかんでしまえば、このURLをブラウザでたたきまくれば何回でもボーナスをゲットできてしまうという。
そしてこのURLをつかむのなんて全く簡単な話だということ。

ちゃんとワンタイムトークンなものを使うようにしましょう。