ある本に、セッションのワンタイムチケット法として以下のように書かれていました。
$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の値は分かってしまいます。
むしろ逆に相手に教えてしまっているのではと思うのですが、これはどういう事なのでしょうか?
何かこの他に処理をして実装する必要があるのでしょうか?
No.2ベストアンサー
- 回答日時:
ソースコードを見るかぎり、$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になると思います。
No.3
- 回答日時:
ANo.1さんに補足
ブラウザからticketとセッションID(Cookie)が送られますよね。受け取ったサーバは、POSTで送られてきたと、セッションIDで紐付いているセッション変数のticketを照合します。
#ここで大事なのは、ticketが「ワンタイム」ということです.。
照合して処理が終わったら、$_SESSION['ticket']はクリアしますし、次にticketが必要な局面では別の値が再発行されます。
なのでticketだけを取り出して悪用しようとしても、その時点でのセッション変数のticketはすでに存在しないか他の値になっているので照合で不一致になります。
No.1
- 回答日時:
>hiddenで渡したとしても
そのチケット自体は公開キーみたいなもんでしょ。
かりにhiddenのデータを取得して、別のところで使おうとしても
その時には別のチケットが発行されているので問題ないのでは?
かりそめにセッションのチケットと、ポストされたチケットが
その時だけあえばいいのだから
結局セッションidだってクッキーやなにやらで読もうとすれば
よめるのだから、同じことでしょ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 遊園地・テーマパーク サンリオピューロランド 1 2022/08/21 11:06
- ライブ・コンサート・クラブ ※矢沢永吉のファンクラブ入ってますが、㈯は、なかなか当たりません。そうしたら、当たりますか? 0 2023/05/13 20:25
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- 英語 ホテルのフロントバイトをしているのですが、最近海外のお客様が多く、英語での接客を求められることが多く 6 2022/11/23 01:12
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セッション変数にパスワードを...
-
【PHP + MySQL】ログインの
-
PHPSESSIDについて
-
複数のサーバで運営する場合の...
-
ログイン画面をはさんだ後、自...
-
クッキーを使わないセッション...
-
Dosブロンプトでtabを出力したい
-
DTOとEntityの差は何ですか。
-
wordの差し込み印刷で文字...
-
Yahoo! JAPAN IDを新規取得でき...
-
「取得先」という表現について
-
phpでcookieがうまく保存されない
-
【C#】DataGridViewの最大列数...
-
switch()文で値の大小比較
-
積立投資してます。現在平均取...
-
syntax error, unexpected 'ech...
-
Windowsのsetコマンドでの小数...
-
バッチファイルでpingの結果を...
-
アクセスの度にIPアドレスを変...
-
VBA コレクションに2次元配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
PHPのセッション有効期限について
-
セッション変数にパスワードを...
-
複数のサーバで運営する場合の...
-
ログインしたら他からログイン...
-
ブラウザを閉じた後もセッショ...
-
セッションを維持したまま、サ...
-
PHP SESSION変数を複数使用でき...
-
session_start()で生成されるセ...
-
HTTPヘッダー内での順番などに...
-
「ログイン機能を持たせる」説...
-
session_regenerate_id
-
Sessionの上限について
-
初歩的な質問 セッション管理に...
-
$_SESSIONと、POSTやGETの違い
-
ログイン画面をはさんだ後、自...
-
セッション変数の命名規則
-
複数ページでセッションを使わ...
-
セッション ID とセッション名...
-
セッションのスコープ(有効範...
おすすめ情報