HTTPSクエリ文字列は安全ですか?


351

HTTPSを使用する安全なWebベースのAPIを作成しています。ただし、クエリ文字列を使用してユーザーにパスワードの送信を含めるように構成することを許可する場合、これも安全ですか、それともPOSTを介して実行する必要がありますか?

回答:


453

はい、そうです。ただし、機密データにGETを使用することは、いくつかの理由で悪い考えです。

  • 主にHTTPリファラーのリーク(ターゲットページの外部画像がパスワードをリークする可能性があります[1])
  • パスワードはサーバーログに保存されます(これは明らかに悪いです)
  • ブラウザの履歴キャッシュ

したがって、Querystringは保護されていますが、機密データをquerystring経由で転送することはお勧めしません。

[1] RFCは、ブラウザがリファラーをHTTPSからHTTPに送信してはならないことを述べていることに注意する必要があります。しかし、それは悪いサードパーティのブラウザツールバーやHTTPSサイトからの外部画像/フラッシュがリークしないことを意味するものではありません。


4
https to httpsリファラーについてはどうですか?httpsを使用してサードパーティのサイトから画像を取得している場合 ブラウザは、以前のリクエストからのクエリ文字列全体をサードパーティのサーバーに送信しますか?
Jus12 2013年

4
@ Jus12はい、それは意味がありますが、意味がありませんが、それがそのように設計されています。
dr。邪悪な

2
では、なぜOAuth2仕様では、(URL内の)クエリパラメータで機密データを送信することが推奨されていないのですか?常にTLS(HTTPS)を使用することをお勧めしますが。tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volkaの最後のポイントを参照してください
gihanchanuka

@ dr.evil問題の詳細を説明してもらえますHistory caches in browsersか、irのリファレンスを追加してください。
LCJ、

1
最新の情報でその回答を完了するには:securitynewspaper.com/2016/08/01/…(プロキシPACハックによりHTTPS URLの傍受が可能になります)
Tom

78

「ネットワークパケットの盗聴」の観点からすると、ブラウザは最初に安全な接続を確立し、次にGETパラメータを含むリクエストを送信するため、GETリクエストは安全です。ただし、GET urlはユーザーのブラウザー履歴/オートコンプリートに保存されます。これは、たとえばパスワードデータを保存するのに適した場所ではありません。もちろん、これは、ブラウザーからサービスにアクセスする可能性があるより広い「Webservice」定義を使用する場合にのみ適用されます。カスタムアプリケーションからのみアクセスする場合、これは問題にはなりません。

そのため、少なくともパスワードダイアログには投稿を使用することをお勧めします。また、littlegeekが投稿したリンクで指摘されているように、GET URLはサーバーログに書き込まれる可能性が高くなります。


48

はい、クエリ文字列は暗号化されます。

背後にある理由は、クエリ文字列はアプリケーション層プロトコルであるHTTPプロトコルの一部であり、セキュリティ(SSL / TLS)部分はトランスポート層に由来するためです。最初にSSL接続が確立され、次に(HTTPプロトコルに属する)クエリパラメータがサーバーに送信されます。

SSL接続を確立するとき、クライアントは次の手順を順番に実行します。example.comという名前のサイトにログインしようとしていて、クエリパラメータを使用して認証情報を送信するとします。完全なURLは次のようになります。

https://example.com/login?username=alice&password=12345)
  1. クライアント(ブラウザ/モバイルアプリなど)は、最初にDNSリクエストを使用example.comしてドメイン名をIPアドレスに解決します(124.21.12.31)。その情報をクエリする場合、ドメイン固有の情報のみexample.comが使用されます。
  2. これで、クライアントはIPアドレスを使用してサーバー124.21.12.31に接続しようとし、ポート443(デフォルトのHTTPポート80ではなくSSLサービスポート)に接続しようとします。
  3. これで、サーバーはexample.com証明書をクライアントに送信します。
  4. クライアントは証明書を確認し、セッションの共有秘密鍵の交換を開始します。
  5. 安全な接続が正常に確立された後、クエリパラメータは安全な接続を介して送信されます。

したがって、機密データを公開することはありません。ただし、この方法を使用してHTTPSセッションで認証情報を送信することは、最善の方法ではありません。別のアプローチをとるべきです。


2
しかし、@ drによる回答を参照してください。邪悪なことに、採石場の文字列はログファイルとキャッシュに格納されるため、サーバー上では安全ではありません。
zaph 2016年

3
こんにちは、HTTPSのセキュリティに関して、目的は、データを安全にサーバーに送信することです。途中の誰かがデータを盗聴することはできません。それは可能であり、その質問に答えますが、サーバーが後で行うことを制御することは本当に困難です。そのため、これも正しい方法ではないと述べました。これに加えて、クライアントからパスワードを送信しないでください。常にデバイスでハッシュし、ハッシュ値をサーバーに送信する必要があります。
Ruchira Randana

セキュリティの観点から、採石場の文字列で機密情報を送信することは安全ではないため、POSTで送信するのが最善です。また、パスワードは通常、クライアントではなくサーバー上でハッシュされます。「クライアントからパスワードを送信しないでください」という文は、回答と矛盾しています(e.g http://example.com/login?username=alice&password=12345)
zaph 2016年

秘密鍵はフロントエンドから簡単に取得できるため、クライアントでの@RuchiraRandanaハッシュは無意味です。
ジェームズW

@JamesW " プライベートキーは、フロントエンドから簡単に取得されます "どのキーですか?
curiousguy

28

はい。HTTPSセッションのテキスト全体がSSLによって保護されます。これには、クエリとヘッダーが含まれます。その点では、POSTとGETはまったく同じです。

メソッドのセキュリティについては、適切な検査なしでは言うことはできません。


27
ブラウザとサーバー間の単なる通信以上のセキュリティがあります
JoeBloggs

26

SSLは最初にホストに接続するため、ホスト名とポート番号はクリアテキストとして転送されます。ホストが応答してチャレンジが成功すると、クライアントはHTTPリクエストを実際のURL(3番目のスラッシュ以降)で暗号化し、サーバーに送信します。

このセキュリティを破る方法はいくつかあります。

「中間者」として機能するようにプロキシを設定することが可能です。基本的に、ブラウザーは実サーバーへの接続要求をプロキシーに送信します。プロキシがこのように構成されている場合、SSLを介して実サーバーに接続しますが、ブラウザは引き続きプロキシと通信します。そのため、攻撃者がプロキシにアクセスできる場合、プロキシを通過するすべてのデータをクリアテキストで見ることができます。

リクエストはブラウザの履歴にも表示されます。ユーザーはサイトをブックマークするように誘惑されるかもしれません。一部のユーザーはブックマーク同期ツールをインストールしているため、パスワードがdeli.ci.usまたは他の場所で終わる可能性があります。

最後に、誰かがあなたのコンピュータをハッキングして、キーボードロガーやスクリーンスクレイパーをインストールした可能性があります(多くのトロイの木馬型ウイルスがインストールします)。パスワードは(パスワードダイアログの「*」ではなく)画面に直接表示されるため、これは別のセキュリティホールです。

結論:セキュリティに関しては、常に人道に頼ってください。あなたが知らない、考えられない、そしてあなたの首を骨折するものが多すぎる。


3
「ブラウザは引き続きプロキシと通信します」とは正しくありません。ブラウザが信頼するCAを制御できる場合にのみ、プロキシが生成できる有効な証明書をブラウザに提示する必要があります。
Pieter


10

Sloughの応答における[...] HTTPリファラーの漏洩(ターゲットページの外部画像がパスワードを漏洩する可能性がある)に関する記述に同意しません。

HTTP 1.1 RFCは明示的に述べています

参照ページがセキュアなプロトコルで転送された場合、クライアントは(非セキュアな)HTTPリクエストにリファラーヘッダーフィールドを含めないでください。

とにかく、サーバーログとブラウザーの履歴は、機密データをクエリ文字列に入れない十分な理由です。


2
その言葉は再び「すべき」です。すべてのブラウザのすべてのバージョンをパスワードで信頼しますか?
JoeBloggs 2008年

1
これはGETとPOSTにどの程度正確に関連していますか?HTTPS経由でPOSTを使用している場合、「すべてのブラウザのすべてのバージョン」は安全でしょうか?
Arnout

2
さらに、HTTPS WebページがHTTPS経由で外部イメージ取得している可能性があります。その場合、ブラウザはリファラーヘッダーを含めて、パスワードを公開する必要があります...
AviD

3
@Arnout:何べきではない手段を示しています。このRFCをお読みください: ietf.org/rfc/rfc2119.txt そのてはならないと同じではありません、あなたが引用された部分がreleventとブラウザエージェントはまだリファラを含めることが本当にないので、 HTTPへ。
アンディ

8

はい、あなたがHTTPS接続を確立した瞬間から、すべてが安全です。POSTがSSL経由で送信されるときのクエリ文字列(GET)。


-4

パスワードをMD5ハッシュパラメータとして送信し、ソルトを追加できます。サーバー側で認証を比較します。


11
MD5は、パスワードに適したハッシュ関数ではありません。
slawek 2014年

1
ハッシュ化されているかクリアテキストであるかにかかわらず、GETパラメータ内でパスワードを送信することはお勧めできません。説明については、上位投票の回答を参照してください。Aaaand ... MD5はもうどこにも使用すべきではありません...
Thomas

パスワードに適したハッシュ関数ではありません」パスワードをクリアテキストでサーバーに送信するよりも優れていますlol
curiousguy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.