こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

セッションのワンタイムチケット法について

ある本に、セッションのワンタイムチケット法として以下のように書かれていました。

$ticket = md5(uniqid(mt_rand(), TRUE));
$_SESSION['ticket'] = $ticket;

<input type="hidden" name="ticket"value="<?php echo$ticket; ?>" />

$ticket = $_POST['ticket'];
$halfticket = $_SESSION['ticket'];
if (!isset($ticket)) {
die("不正な操作が行われました。");
} elseif ($ticket != $halfticket) {
die("不正な操作が行われました。");
}

そこで教えて頂きたいのですが、hiddenで渡したとしても、ソースコードを確認すれば$ticketの値は分かってしまいます。
むしろ逆に相手に教えてしまっているのではと思うのですが、これはどういう事なのでしょうか?

何かこの他に処理をして実装する必要があるのでしょうか?

投稿日時 - 2011-10-27 21:59:19

QNo.7098192

困ってます

質問者が選んだベストアンサー

ソースコードを見るかぎり、$ticketの値は暗号的な強度のある乱数なのでソースコードをいくら確認した所でその値はわかりません。mt_randとuniqidのマニュアルを確認してみてください。

PHPのversion 4.2.0以降だとmt_randは自動的にシードされます。よって、mt_randの結果はたとえ初めて実行したとしても毎回違う値が返ってきます。また、uniqidでマイクロ秒単位の現在時刻に基づき、mt_randが作った乱数を頭に持つユニークなIDを作っています。つまり、この時点でmt_randの乱数+その他のエントロピーが入ったマイクロ秒を元にしたIDとなっており、予測が難しい値になっています。これをMD5でハッシュ値をとっているので次にどんな値が$ticketに入るかを推測することは非常に困難です。

というわけで、ソースコードを読んだら暗号強度のある乱数値が$ticketに入っていることはわかりますが、具体的に何の値が入っているかはまず予測できないことがわかります。惜しむらくは強衝突耐性が疑われているMD5ではなく、SHA256あたりを使うと更に強い$ticketになると思います。

投稿日時 - 2011-10-27 23:24:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ANo.1さんに補足

ブラウザからticketとセッションID(Cookie)が送られますよね。受け取ったサーバは、POSTで送られてきたと、セッションIDで紐付いているセッション変数のticketを照合します。

#ここで大事なのは、ticketが「ワンタイム」ということです.。

照合して処理が終わったら、$_SESSION['ticket']はクリアしますし、次にticketが必要な局面では別の値が再発行されます。

なのでticketだけを取り出して悪用しようとしても、その時点でのセッション変数のticketはすでに存在しないか他の値になっているので照合で不一致になります。

投稿日時 - 2011-10-27 23:25:35

ANo.1

>hiddenで渡したとしても

そのチケット自体は公開キーみたいなもんでしょ。
かりにhiddenのデータを取得して、別のところで使おうとしても
その時には別のチケットが発行されているので問題ないのでは?
かりそめにセッションのチケットと、ポストされたチケットが
その時だけあえばいいのだから

結局セッションidだってクッキーやなにやらで読もうとすれば
よめるのだから、同じことでしょ?

投稿日時 - 2011-10-27 22:46:57

あなたにオススメの質問