ワンタイムトークンの実装


ワンタイムトークンは、ちゃんと意図した画面から遷移したものということを
証明することができるものらしいです。


なので、勝手に意図しないページに飛ばされたとしても、
プログラムが判断して、はじいてくれるように実装してみたいと思います。





簡単な流れ


トークンを作成する(マイクロ秒取得して、ランダムな文字列つけたりとか)
 ↓
セッションに書き込む(同時にウィンドウが開いていることを想定して、配列で書き込む)
 ↓
POSTでトークンを送信する
 ↓
送信先でPOSTの中身とセッションの値を比較する
 ↓
同じものがあればOKということ





具体的なソース(cakephpで実装)


・actionのindexでトークン作成

//セッションに登録されているか確認
$token = $this->Session->read('token');

//されていたら、$token上書き
if(isset($token)){
  $token = $this->Session->read('token');
}

//トークンを作成(モデルにトークンを作成する関数を作成済み)
$tdata = $reminder->token();

//トークンを追加
$token[] = $tdata;

//tokenデータ保持
$this->Session->write('token',$token);
$this->set('token', $tdata); //ビューに値をセット


セットした値をフォーうムを使用して、POSTで渡したい画面に渡す。
(javascriptをしようします)
参考:http://www.openspc2.org/reibun/javascript/form/001/

そのpostで値を使用して以下を記述します。



比較したいアクションに記述


$token = $this->Session->read('token');

//POSTとセッションの値が一致するか?
if (!in_array($_POST['token'], $this->Session->read('token'))) {
$this->redirect(array('action' => 'index'));
}else{

ここに一致した場合の記述

}



とりあえず、流れはこんな感じで実装してみました!