web-dev-qa-db-ja.com

機密データはクエリ文字列で渡される必要がありますか?

POSTリクエストとは異なり、 クエリ文字列 を介して機密データを渡す必要がありますか? クエリ文字列は暗号化されます 、しかし、ショルダーサーフィンなど、クエリ文字列でデータを渡さないようにする他の理由はありますか?

46
C. Ross

クエリ文字列がユーザーのクリック可能なリンクのターゲットである場合(一部のJavaScriptから使用されるURLではなく)、対応するページが読み込まれると、ブラウザのURLバーに表示されます。次の問題があります。

  • URLが表示されます。ショルダーサーファーはそれを見て、そこから物事を学ぶことができます(例:パスワード)。
  • ユーザーはブックマークすることができます。これは機能になる可能性があります。ただし、データがディスクに書き込まれることも意味します。
  • 同様に、URLは「履歴」に到達するため、とにかくディスクに書き込まれます。後で取得される可能性があります。たとえば、ブラウザがChromeの場合、昼休みの攻撃者はCtrl + Hを入力して「履歴タブ」を開き、すべてのクエリ文字列を取得するだけです。
  • ページが印刷される場合、機密情報を含むURLが印刷されます。
  • クエリ文字列を含むURLもWebサーバーに頻繁に記録され、これらのログは適切に保護されない場合があります。
  • クエリ文字列にはサイズ制限があり、ブラウザーとサーバーによって異なります(ここでは実際には標準はありませんが、約4 kBを超えると問題が発生することが予想されます)。

したがって、クエリ文字列がHTMLページの単純なリンクターゲットである場合、機密データはPOSTフォームの一部として送信される必要がありますnot URLにエンコードされますプログラムによるダウンロード(AJAX方法))の場合、これはそれほど問題にはなりません。

41
Thomas Pornin

ここでの他の回答に加えて、クエリ文字列はWebサーバーのログファイル、HTTPプロキシにも保存され、SSLがBluecoatなどのSSL監視ツールと組み合わせて使用​​されている場合でも確認できます。

いいえ、機密データはHTTP "GET"経由で送信しないでください常に「POST」経由で送信する必要があります

編集:

POSTを使用する必要があるもう1つの理由は、GETが CSRF攻撃の影響を受けやすいためです

32

機密データは次のいずれかに渡される必要があります。

  1. 安全なHTTPのみのCookie(安全はSSLのみを意味し、HTTPのみはJavaScriptがアクセスできないことを意味します)(たとえば、ログインしたことを識別するランダムなトークン)、または
  2. POST変数(SSL経由)。

3つの理由:

  1. 通常、コンピューターはデフォルトでクエリ文字列を(ブラウザーの履歴に)記録します。
  2. 相手側のウェブサーバーはデフォルトでクエリ文字列を記録します。攻撃者が誤ってパスワードを取得するのを防ぐために、ランダムなソルト(bcryptなど)で強力なキー強化された暗号化ハッシュのみをWebサーバーがスマートに格納するというパスワードが渡される場合、これは悪いことです。明らかに、必要に応じてPOST変数を記録することは難しくありませんが、通常は行われません。
  3. 機密データは通常、その機密データに基づいて何らかのアクションが実行されている場合にのみ渡されます。また、何らかのアクション(ログイン、データベースに保存/操作する安全なデータの受け渡しなど)を実行している場合は、POST対GETを使用する必要があります。

一般に、クロスサイトリクエストフォージェリ(CSRFはXSRFとも呼ばれます)を防ぐルールは、POSTリクエストに対してのみトリガーされます。GETは、Webサーバーからデータを取得するためのHTTPリクエストメソッドですその他の効果(このページが要求されたことをログファイルに入力するなどの害のないもの以外)POSTは、ユーザーがデータを送信して何らかのアクションを実行するためのプロトコルです(たとえば、Webサイトから何かを注文するなど) ;銀行口座からお金を送金する;パスワードを変更する)これはランダムなCSRFトークンであり、通常、ほとんどのフレームワークでGETリクエストに必要ですが、POSTリクエストではしばしば必要になります。

(そして、Thomas Porninとmakerofthings7がそれぞれ1と2に触れている間、私は両方について言及しました 以前はやや類似した質問で 。)

19
dr jimbob

それが避けられるなら、私はいつもそれを避けます。クエリでデータを渡すために正当なneedがない限り、これは閉じたままにする必要があるもう1つの攻撃面です。ストリング。

また、あなたや将来の開発者がデータを適切にフィルタリング/サニタイズせず、攻撃対象をさらに広く開かない可能性もあります。安全でないアプリでも、誤って挿入を許可した場合、悪意のある攻撃者がXSSおよびXSRFスクリプトをDBに挿入し、機密性の低いアプリを使用して他のユーザーを攻撃するため、安全にプレイするのが最善です。

ショルダーサーフィンは、環境によっては、もう1つの正当な懸念事項です。アプリを可能な場所で使用する場合(ライブラリー、誰かが調べられる小部屋、机が間違った方向を向いているオフィスなど)は、潜在的な懸念事項です。アプリを使用している人が全員、机が向けられている部屋にいて、ショルダーサーフィンが問題にならない場合は、心配する必要はありません。しかし、あなたがそれを確実に知らない場合、そしてそれがalwaysであることを知らない場合、それが心配です。

4
David Stratton

OWASPに基づくRESTセキュリティチートシート https://owasp.org/www-project-cheat-sheets/cheatsheets/REST_Security_Cheat_Sheet

GETリクエストでは、機密データをHTTPヘッダーで転送する必要があります。

0
xeranic