注意:
多くの人が「プライベート」URLと認証を混同しているようです。また、信頼できるエンティティを介してリンクを送信することは、二要素認証の試みであるという混乱があるようです。明確にするために、推測しにくいものではあるが、一般にアクセス可能なリソースについて話している。
プライベートURLを使用する場合、常に侵害される可能性があると想定する必要があります。侵害された場合でも、リソースが攻撃者に情報を漏らさないように、そのようなURLを設計する必要があります。
プライベート/推測困難なURLは、パスワードベースの認証と同等ではありません。本来、プライベートURLはまったくプライベートではなく、一般公開されているリソースです。「プライベート」URLという用語は誤った名前であり、むしろ「あいまいな」URLだと思います。
「プライベート」URLの使用が許容される特定のケースがありますが、パスワード認証やキーベース認証などの従来の認証方法よりも本質的に安全性が低くなります。
「プライベート」なURLがよく使用されるのは、次のような場所です。
- パスワードリセットメール
- 証明書生成メール
- アカウント/メールの確認メール
- 購入したコンテンツ(電子書籍など)の配信
- フライトチェックイン、搭乗券の印刷、従来の認証に加えてプライベートURLの使用など、その他のさまざまなこと
ここでの共通点は、通常、ランダムURLはワンショット操作にのみ適しているということです。また、従来の認証とランダムURL は相互に排他的ではありません。実際、これらを相互に組み合わせて使用して、リソースを配信するときにセキュリティを強化できます。
ロバートハーベイが指摘したように、ランダム/プライベートURLを安全に使用する唯一の方法は、ページを動的に生成し、ユーザーを半認証済みとみなす方法でURLを送信することです。これは、電子メール、SMSなどです。
ランダムに生成された/プライベートURLには通常、いくつかのプロパティがあります。
- 妥当な時間の経過後に期限切れになるはずです
- これは使い捨てURLである必要があります。IEは、最初にアクセスされた後に有効期限が切れます。
- ユーザーを安全に認証するために信頼する他のエンティティへのユーザーの認証を延期する必要があります。(リンクをメールまたはSMSなどで送信することにより)
- リソースを公開するAPIのレートを制限するか、推測できないほど十分なエントロピーを持つURLエンドポイントを作成することにより、最新のコンピューターが期限切れ前の時間枠でURLをブルートフォースすることは不可能です。
- ユーザーに関する情報が漏洩することはありません。IE:ページがパスワードをリセットする場合:ページはリクエスターのアカウント情報を表示するべきではありません。Aliceがパスワードリセットリンクを要求し、Bobが何らかの方法でURLを推測した場合、Bobがリセットしているパスワードを知る方法がありません。
- ユーザーに関する情報が漏れる場合は、従来の認証に加えて使用する必要があります。たとえば、Cookieが設定されている場合、またはsession_idがまだ有効である場合、ページはユーザーを認証済みと見なします。
異なるリソースには異なるレベルのセキュリティが必要です。たとえば、秘密のレシピを友人と共有したい場合、ランダム/プライベートURLを使用して友人と共有することは許容されます。ただし、リソースを使用して誰かのIDを盗んだり、他のサービスプロバイダーのアカウントを侵害したりできる場合は、そのリソースへのアクセスを制限する方がはるかに重要です。