最近、このように設計された多くのAPIを見てきました。
curl "https://api.somewebsite.com/v1/something&key=YOUR-API-KEY"
クエリ文字列でAPIキーをURLの一部として渡すことは、少なくともHTTPでは安全ではないのは初歩的なことではありませんか。
要約:機能URLは、多くの人々が信用するよりも安全ですが、すべてのアプリケーションに適しているわけではなく、使用するには特別な注意が必要です。
これらのタイプのURLは、一般に機能/シークレットURLとして知られています。
脅威モデルを指定せずにセキュリティについて説明しても意味がありません。頭に浮かぶカップルは次のとおりです。
ネットワーク攻撃(1および2)に関して、秘密のURLは完全に安全です、HTTPSを使用している場合(2016年ですが、HTTPを使用する必要はもうありません!).
サーバーのホスト名はネットワークを介してプレーンテキストで送信されますが、実際のURLはサーバーに送信される前に暗号化されます。これは、後にのみ発生するGETリクエストの一部であるためです TLSハンドシェイク。
ショルダーサーフィン(3)に関しては、十分なエントロピーを持つ秘密のURLは偶然の攻撃に対して合理的に安全です・例として、GoogleドキュメントのURLを指定します。
https://docs.google.com/document/d/5BPuCpxGkVOxkjTG0QrS-JoaImEE-kNAi0Ma9DP1gy
同僚の画面を通り過ぎている間、それを思い出して頑張ってください!
明らかに攻撃者がカメラを持っていて、気付かれずに写真を撮ることができる場合、それはまったく別の問題です-そのような状況では秘密のURLを使用しないでください。シークレットURLから離れてHTTPリダイレクトを行うことで攻撃を軽減できるため、画面に数秒間しか表示されません
コンピューターで上位の権限を持つ攻撃者(4)に関しては、秘密のURLは長いパスワードよりも安全ではありませんまたはクライアント側のTLS証明書-実際にはすべて完全に安全ではないため、それについてできることはあまりありません。
一方で、通常の権限(5)を持つ攻撃者は、OSの適切なセキュリティプラクティスに従っている限り、シークレットURLを知ることもできません。ファイル(特にブラウザーの履歴)は、他のユーザーが読み取れないようにする必要があります。
APIキー(この質問の要点であった6)を保護するために、シークレットURLも別のメカニズム(AJAX POSTなど)よりも安全ではありません。 APIキーを使用するユーザーは、ブラウザのデバッグモードを使用してキーを取得する方法を知っています。
誰かに秘密を送り、それを見ないように期待するのは合理的ではありません!
一部の人々はサーバー側のリスクについて尋ねました。
脅威のモデリングによってサーバー側のリスクを扱うことは合理的ではありません。ユーザーの観点からは、サーバーを実際には 信頼できるサードパーティ として扱う必要があります。敵がサーバー側で内部ネットワークにアクセスできる場合は、実際には何もできません(特権のように)クライアントのコンピューター上の攻撃者、つまり上記の脅威モデル4)。
攻撃をモデル化する代わりに、概要を説明します意図しない秘密の露出の一般的なリスク。
サーバー側でシークレットURLを使用する際の最も一般的な問題は、両方のHTTPサーバーとリバースプロキシがログを保持し、URLが含まれることが非常に多いであることです。
別の可能性として、シークレットURLは予測可能な方法で生成される可能性があります-実装に欠陥があるため、安全でない [〜#〜] prng [〜#〜] 、 シード の場合、エントロピーが不十分です。
シークレットURLを使用するサイトを設計する際に考慮しなければならない多くの注意事項もあります。 W3C TAGによるこのページ はそれらの多くをカバーしています。
実際には、動的なコンテンツを含むサイトの場合、すべてを安全に実行するのは非常に困難です- Google と Dropbox の両方が過去に失敗しました this答え
最後に、シークレットURLには他の認証方法に比べていくつかの利点があります:
これは、そのAPIの使用方法と、アクセスするデータのタイプによって異なります。たとえば、Googleマップにアクセスするものは、銀行のデータにアクセスするものよりもはるかにリスクが低くなります。
明らかに、クライアント側のコードのような呼び出しは安全ではありません。ユーザーはAPIキーを簡単に知ることができます。
API呼び出しがサーバー間で行われる場合、問題はそれほどありません。
HTTPを使用すると、接続が盗聴される可能性がありますが、HTTPSはその問題を解消します。
URLのキーのもう1つの問題は、完全なURLがログファイルに記録されることです。これで、キーを探す場所が増えるため、アプリの攻撃対象が広がります。
あなたの質問に答えるために、URLでキーを渡すことは本質的に安全ではなく、代わりの方法より安全ではなく、ベストプラクティスではありません。 APIが機密性の高いものにアクセスしておらず、接続がHTTPSを介しており、サーバーからサーバーへの呼び出しが行われている場合、低リスクのサービスには「十分」である必要があります。
一般にシークレットをGETパラメータとして渡すことはお勧めできません。私はリストを編集しました 私のブログで 少し前に潜在的なセキュリティ問題について:
秘密は、次のように他の当事者に漏洩する可能性があります。
あなたのコンピュータ/スマートフォンから
サーバー側
サードパーティへ
Referer
ヘッダーを介した他のWebサイトそれらのいくつかはAjaxリクエストには適用できませんが、ymmv
セッション固定とCSRFの脆弱性のリスクについて誰も明示的に触れていないのはなぜでしょうか。もちろん、CSRFトークンを追加して安全なセッション処理を実装することでこれらを軽減できますが、これは実際に関連するコードを制御できることを意味します。
この質問にはタイトルA secret in a URL
回避できる可能性のある攻撃ベクトルではなく、緩和策を実装すれば十分であるという結論に達する人もいます。