ワンタイムトークンの実装
ワンタイムトークンは、ちゃんと意図した画面から遷移したものということを
証明することができるものらしいです。
なので、勝手に意図しないページに飛ばされたとしても、
プログラムが判断して、はじいてくれるように実装してみたいと思います。
簡単な流れ
トークンを作成する(マイクロ秒取得して、ランダムな文字列つけたりとか)
↓
セッションに書き込む(同時にウィンドウが開いていることを想定して、配列で書き込む)
↓
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{ここに一致した場合の記述
}
とりあえず、流れはこんな感じで実装してみました!