電子書籍の厳選無料作品が豊富!

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

$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の値は分かってしまいます。
むしろ逆に相手に教えてしまっているのではと思うのですが、これはどういう事なのでしょうか?

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

A 回答 (3件)

ソースコードを見るかぎり、$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になると思います。
    • good
    • 0

ANo.1さんに補足



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

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

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

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

>hiddenで渡したとしても



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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!