質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3894閲覧

認証する際の「トークンURLの長さ」について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2021/07/29 23:02

以前にコチラで質問した、
ウェブサービスの続きになります。

ウェブサービスの作成にあたり、
ユーザー登録の実装方法、トークンURLの長さについて質問があります。

本人を確認する方法にて、
メールアドレスを入力するフォームから「登録」ボタンを押すと、

「該当のメールアドレスに「登録用URL」を送り、そのURLをクリクして登録を続けてもらう」

を実装しました。お陰様で無事にできました。

PHP

1$urltoken = hash('sha256',uniqid(rand(),1)); 2//$urltoken = 28a97660379134480e0b0376a781f03d98375697dce6db65e718fbc1a4b980b8

ここで質問があります。
トークンの長さについてです。

例えばマネーフォワードの場合、
パスワードリセットは以下のトークンURLでした。

2gsoALCT5M1XJ_9Sb8CL

質問事項は、
・トークンがマネーフォワードのように短くても問題ないのでしょうか?
・短くする場合には、上記のコードをどのようにすればよいのでしょうか?

セキリティ上問題なければ、短くしたいと考えています。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

トークンの長さについては既に指摘があるとおりですが、以下の方法には別の問題があります。

PHP

1$urltoken = hash('sha256',uniqid(rand(),1));

uniqid、randは共に値の予測可能性がゼロではありません。

uniqid関数のマニュアルには以下のように警告されています。

警告

この関数が生成する値は、暗号学的に安全ではありません。そのため、これを暗号として使ってはいけません。暗号学的に安全な値が必要な場合は、random_int() か random_bytes() あるいは openssl_random_pseudo_bytes() を使いましょう。

PHP: uniqid - Manual より引用

rand関数にも同様の警告があります。

警告

この関数が生成する値は、暗号学的に安全ではありません。そのため、これを暗号として使ってはいけません。暗号学的に安全な値が必要な場合は、random_int() か random_bytes() あるいは openssl_random_pseudo_bytes() を使いましょう。

PHP: rand - Manual

「暗号として使ってはいけません」という表現は分かりにくいですが、「セキュリティ目的で使ってはいけない」と考えればよいでしょう。
ではどうすればよいかというと、上記警告にあるように、random_bytesを使います。random_bytes単体で安全なので、ハッシュ関数を通す必要はありません。

PHP

1$urltoken = bin2hex(random_bytes(32));

投稿2021/07/30 00:03

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/30 01:28

ご回答ありがとうございます。 おかげさまで、知識が広がりました。 分かりやすくご指摘いただきありがとうございます。 ユーザー登録の実装だけでも、 すごく大変な作業なんだと痛感しています。 今回、みなさまの意見を頂いて、 「トークンの長さ・複雑さ」と「制限時間」の組み合わせがあるのかなと思いました。 蛇足ですが、 マネーフォワードは6時間の制限時間でした。 以上、ありがとうございました。 お手数おかけいたしました。
guest

0

トークンがマネーフォワードのように短くても問題ないのでしょうか?

使用期限が決められていれば問題ありません

短くする場合には、上記のコードをどのようにすればよいのでしょうか?

試用期限を短くしましょう
方法としては以下の二つぐらいかと

  • URLに使用期限のタイムスタンプを含める

 ※当然ながらタイムスタンプ書き換えられたら使えないようにする事

  • トークンを有効期限付きでメモリやDBに保存しておき、取得の可否で判定

投稿2021/07/29 23:25

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/30 01:23

ご回答ありがとうございます。 参考になりました。
guest

0

マネーフォワードさんは文字種に大文字と記号も使っているので桁数だけで単純に判断はできません。
制限時間を設けるなどすれば短くしてもリスクを小さくすることはできると思います。

投稿2021/07/29 23:32

tabuu

総合スコア2480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/30 01:24

ご回答ありがとうございます。 ご指摘の通り、マネーフォワードさんは大文字などありました。 制限時間とトークンの複雑さの関係について、深い知識があることがわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問