web-dev-qa-db-ja.com

GETおよびPOSTを使用したSSL

私はセキュリティにかなり慣れているので、基本的な質問は許しますが、SSLはPOSTリクエストを暗号化しますが、GETリクエストは暗号化しませんか?

たとえば、2つのリクエストがある場合

GET:www.mycoolsite.com/index?id=1&type=xyz

POST

サイト:www.mycoolsite.com/index {パラメータ:id = 1&type = xyz}

GETリクエスト全体(IDとタイプを読み取る)を傍受できると想定しても安全ですか?ただし、POST)を傍受すると、サイトパスを表示できますSSL経由で行っている、彼らはIDとタイプのパラメータを見ることができませんか?

58
TomJ

さて、問題は、HTTPリクエストがどのように見えるか知っていますか

まあ、そうではないと仮定して、これがその例です:

GET /test?param1=hello&param2=world HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

この情報のすべては、SSLトランスポート内にカプセル化されます-回答のコメントに親切に書かれています。これの意味は:

  • 取得パラメータは暗号化されています。
  • HTTP本文(ポストパラメータ)は暗号化されています。

必ずしも安全ではないもの:

  • あなたが求めているホスト。最近のほとんどのWebサーバーはHost: somethingパラメーターをサポートしているため、1つのインターフェースとIPアドレスで1つのWebサーバーが複数のドメインを処理できます。明らかに、このヘッダーisは暗号化されていますが、サイトへの非httpsトラフィックを実行する場合は、接続するホストを明確にする必要があります。そうでない場合でも、逆DNSは確かにそのIPでホストされているものを教えてくれるので、そこから妥当な推測を行うことができます。
  • ブラウザ/クライアント情報。残念ながら、各httpsクライアントは異なっており、そのネゴシエーションプロセスによって、実行されているプラ​​ットフォームやブラウザが明らかにされる可能性があります。これは決して世界の終わりではなく、理解すべき事実にすぎません。

POSTリクエストは、本文が含まれていることを除いて、getリクエストに似ています。これは次のようになります。

POST /testpost HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

param1=hello&param2=hello

もちろん、さらに複雑な変種もありますが、基本的にはとにかくすべて暗号化されています。

59
user2213

他の応答でこれが言及されていませんでしたが、通常はSSLを使用してもGETリクエストに秘密情報(パスワード)を含めないでください。代わりにPOST=を使用してください。なぜですか?機密情報は通常、たとえばブラウザの履歴リスト(https://www.example.com?user=me&password=MyPassword)やサーバーのログなど、両端に記録されます。POST情報(特にパスワードを含む)は、通常はログに記録するように構成できますが、通常はWebサーバーログに書き込まれません。そのため、異なるサイトでパスワードを再利用(または類似の)しないことが最善です。

36
dr jimbob

SSLは暗号化し、要求されたメソッドとURLを含む接続全体の信頼性を保証します。 GETはPOSTと同様に保護されます。

SSLが意図したとおりに機能する場合、盗聴者は、どのIPアドレスがどのIPアドレス(およびどのポートで、ただし通常は443)に接続しているのか、いつ、どのくらいの量かを確認できます。同じマシンに複数の仮想ホストが存在する場合、攻撃者はどのホストに接続しているのかを知ることができません(ただし、盗聴者はHTTPSリクエストの直前にDNSリクエストを表示し、もっともらしい推測をする可能性があります)。この情報もすべて認証されます。アクティブな攻撃者は man-in-the-middle を再生したり、転送中のデータを変更したりすることはできません。

SSLが意図したとおりに機能しない原因:

  • アプリケーションの誤用。一部のデータが誤ってプレーンHTTPで送信されます。
  • 最近の BEASTの脆弱性 など、SSLプロトコルのまれな脆弱性の1つ。
  • サーバーの証明書が漏洩したか、証明機関が証明書を攻撃者に不適切に配信したか、またはクライアントがサーバーの証明書を正しくチェックしないために、攻撃者がサーバーとして偽装できる不正な証明書操作。
    • このメモでは、SSLはほとんどの場合使用されるため、サーバーではなくクライアントでは認証されることに注意してください。サーバーはクライアントについて何も想定できません。
  • サイドチャネル攻撃 は、盗聴者に情報を明らかにする可能性があります。たとえば、参加者がデータを送信する正確なタイミングは、データの計算方法について、したがってデータの性質について何かを明らかにする可能性があります。各パケットのサイズは攻撃者にも知られています。これがどの程度明らかになるかは、参加者が予防策を講じているかどうか、および情報の性質によって異なります。リアルタイムの会話は、ファイルをダウンロードするよりも、このようなトラフィック分析を行う傾向があります。

参照 確立されているHTTPS接続を監視している人々が、それを復号化する方法を知らない可能性があるのはなぜですか? 背景について。

これがHTTPを介してどのように実行されるかについて、もう1つ小さな詳細を追加します。
おそらく、GETリクエストが暗号化されずに送信されることなく、SSLチャネルがどのように作成されるのか(または SSLハンドシェイク に精通している場合は、そうする必要がありますか?)私のリクエストがプロキシを経由する必要がある場合はどうですか-それはどのように可能ですか?

HTTP v1.1は [〜#〜] connect [〜#〜] HTTPメソッドを導入しました。これは基本的に、最も単純なホストURLのみを含むプロキシを介してサーバーに簡略化されたリクエストを送信します。パラメータ、ヘッダー、または本文)。この要求に基づいて、SSLトンネルが構築され、元のGET(またはPOST)要求がそのトンネルを介して送信されます。

6
AviD

言及されていないもう1つの点は、GETを使用し、サードパーティのコンテンツ(サイト広告など)が埋め込まれている、またはリンクされている場合、そのサードパーティのサイトは、Refererヘッダーに完全なURL(機密パラメータデータを含む)を取得することです。

これにより、データを保持してはならない第三者に公開します。

4
Rodney

出典: スタックオーバーフローに対する回答

GETメソッド はデータの取得のみを目的としており、 副作用はありません です。しかし [〜#〜] post [〜#〜] はその特定の目的のためのものです:サーバー側でデータを変更することです。

GETリクエストは、POSTリクエストを偽造しながらページに画像を配置するだけで簡単に偽造できます( Cross-Site Request Forgery を参照)。これも簡単ではありません)許可されたPOSTリクエスト)のみを許可する必要がある理由。

4