GETまたはPOSTは他より安全ですか?


282

HTTP GETをHTTP POSTと比較する場合、セキュリティの観点からの違いは何ですか?選択肢の1つは本質的に他の選択肢よりも安全ですか?もしそうなら、なぜですか?

POSTはURLの情報を公開しないことに気づきましたが、その中に本当の価値はありますか、それともあいまいなことによる単なるセキュリティですか?セキュリティが懸念される場合にPOSTを選択する必要がある理由はありますか?

編集:
HTTPSを介して、POSTデータはエンコードされますが、URLがサードパーティによって盗聴される可能性はありますか?さらに、私はJSPを扱っています。JSPまたは同様のフレームワークを使用する場合、POSTまたはGETに機密データをまとめて配置せず、代わりにサーバー側のコードを使用して機密情報を処理するのがベストプラクティスであると言っても過言ではないでしょうか。


1
JeffのブログCoding Horror:Cross-Site Request Forgeries and Youに、これに関する素晴らしいブログエントリがあります
2008年

ほとんどの場合、POSTを使用しませんか。たとえば、APIの場合、DBからデータを取得する必要があるが、サーバーがデータを返す前に、まず認証を受ける必要があるとしましょう。postを使用すると、セッションIDと、リクエストに必要なすべてのパラメータを渡すだけです。これにGET reqを使用した場合、セッションIDはブラウザーの履歴または途中のどこかに簡単に見つかります。
James111、2015

httpsが普及していなかった戦前(99年または00年前後)のこの議論を覚えています。
David Tonhofer 2017

@DavidTonhofer、あなたはどの戦争を参照していますか?ブラウザ戦争?
DeltaFlyer

@DeltaFlyerいいえ、別名GWOTのスタッフとの永遠の戦争。私たちは何をしましたか。
デビッドトンホーファー2018年

回答:


206

セキュリティに関する限り、それらは本質的に同じです。POSTはURLを介して情報を公開しないことは事実ですが、クライアントとサーバー間の実際のネットワーク通信では、GETと同じくらい多くの情報を公開します。機密性の高い情報を渡す必要がある場合、最初の防御策はSecure HTTPを使用して渡すことです。

GETまたはクエリ文字列の投稿は、特定のアイテムのブックマーク、または検索エンジンの最適化とアイテムのインデックス作成に必要な情報に非常に適しています。

POSTは、1回限りのデータの送信に使用される標準フォームに適しています。ユーザーがクエリをブックマークに保存したり、それらの行に沿って何かを保存したりできるようにする検索フォームの場合を除いて、実際のフォームの投稿にはGETを使用しません。


5
GETでは、ロケーションバーに表示されるURLがPOSTで非表示になるデータを公開する可能性があるという警告があります。
tvanfosson 2008年

93
それは最も単純な意味でのみ隠されています
davetron5000

7
本当ですが、パスワードを入力するときに誰かがあなたの肩越しに見ている可能性があるため、キーボードが安全でないと言うこともできます。あいまいさによるセキュリティとまったくセキュリティの違いはほとんどありません。
stephenbayer 2008年

65
URL内のクエリ文字列の可視性(およびキャッシュ)は、アドレスボックスの安全性が明らかに低くなっています。絶対的なセキュリティなどはないので、ある程度のセキュリティが重要です。
pbreitenbach 2009

6
投稿を使用した場合でも公開されます。あなたの場合、投稿はもう少し安全です。しかし真剣に..変数を取得するのと同じくらい簡単に、ポスト変数を一日中変更できます。Cookieは表示および変更することもできます。サイトが送信する情報の形や形に依存することはありません。必要なセキュリティが高ければ高いほど、必要な検証方法も多くなります。
stephenbayer 2010年

428

GETリクエストは、POSTリクエストよりも安全性がわずかに劣ります。どちらもそれ自体では真の「セキュリティ」を提供しません。POSTリクエスト使用しても、悪意のある攻撃からWebサイトを驚くほど安全に保護することはできません。しかし、GETリクエストを使用することができそうでない場合は、安全なアプリケーションの安全でないを作ります。

「GETリクエストを使用して変更を加えてはならない」というマントラは依然として非常に有効ですが、これは悪意のある動作とはほとんど関係がありません。ログインフォームは、間違ったリクエストタイプを使用して送信されることに最も敏感です。

スパイダーとウェブアクセラレータを検索する

これが、データの変更にPOSTリクエストを使用するべき本当の理由です。検索スパイダーはあなたのウェブサイトのすべてのリンクをたどりますが、見つけたランダムなフォームを送信しません。

Webアクセラレーターは、クライアントのマシンで実行され、ログインしたユーザーのコンテキストですべてのリンクを「クリック」するため、検索スパイダーよりも劣ります。したがって、GETリクエストを使用してデータを削除するアプリケーションは、たとえ管理者が必要な場合でも、(悪意のない!)Webアクセラレータの命令に喜んで従い、表示されるものをすべて削除します

混乱した代理攻撃

混乱して副攻撃(副ブラウザである)であるにかかわらず、あなたがGETやPOSTリクエストを使用するかどうかの可能性

攻撃者が制御するWebサイトでは、GETとPOSTは、ユーザーの操作なしで同様に簡単に送信 できます

POSTの影響がやや少ない唯一のシナリオは、攻撃者の制御下にない多くのWebサイト(たとえば、サードパーティのフォーラム)が任意の画像を埋め込むことを許可する(攻撃者が任意のGETリクエストを挿入できるようにする)ことですが、自動か手動かにかかわらず、任意のPOSTリクエストを挿入する方法。

Webアクセラレータは混乱した代理攻撃の例であると主張する人もいるかもしれませんが、それは単なる定義の問題です。どちらかといえば、悪意のある攻撃者がこのを管理していないので、それはほとんどいない攻撃副があっても、されて混乱します。

プロキシログ

プロキシサーバーは、クエリ文字列を削除せずに、GET URL全体をログに記録する可能性があります。POST要求パラメーターは通常、ログに記録されません。どちらの場合も、Cookieがログに記録されることはほとんどありません。(例)

これはPOSTを支持する非常に弱い議論です。まず、暗号化されていないトラフィック全体を記録できます。悪意のあるプロキシには、すでに必要なものがすべて含まれています。第2に、リクエストパラメータは攻撃者にとって使用が制限されています。本当に必要なのはCookieであるため、プロキシログしかなければ、GETまたはPOST URLを攻撃することはできません。

ログイン要求には1つの例外があります。これらはユーザーのパスワードを含む傾向があります。これをプロキシログに保存すると、POSTの場合にはない攻撃のベクトルが開かれます。ただし、プレーンHTTPを介したログインは、本質的に安全ではありません。

プロキシキャッシュ

キャッシュプロキシはGET応答を保持する場合がありますが、POST応答は保持しません。そうは言っても、GET応答は、URLをPOSTハンドラーに変換するよりも少ない労力でキャッシュ不可にすることができます。

HTTP「リファラー」

ユーザーがGETリクエストへの応答として提供されるページからサードパーティのWebサイトに移動すると、そのサードパーティのWebサイトはすべてのGETリクエストパラメータを確認できます。

「リクエストパラメータを第三者に公開する」というカテゴリに属します。その重大度は、それらのパラメータに含まれるものによって異なります。POSTリクエストは当然これに影響されませんが、GETリクエストを悪用するには、ハッカーは自分のWebサイトへのリンクをサーバーの応答に挿入する必要があります。

ブラウザの履歴

これは、「プロキシログ」引数と非常によく似ています。GETリクエストは、パラメータとともにブラウザの履歴に保存されます。攻撃者は、マシンに物理的にアクセスできる場合、これらを簡単に入手できます。

ブラウザの更新アクション

ユーザーが「更新」をクリックするとすぐに、ブラウザーはGET要求を再試行します。シャットダウン後にタブを復元するときにそれを行う可能性があります。したがって、アクション(支払いなど)は警告なしに繰り返されます。

ブラウザは警告なしでPOSTリクエストを再試行しません。

これは、データの変更にPOSTリクエストのみを使用する正当な理由ですが、悪意のある動作、つまりセキュリティとは関係ありません。

だから私は何をすべきですか?

  • 主にセキュリティ関連以外の理由で、POSTリクエストのみを使用してデータを変更します。
  • ログインフォームにはPOSTリクエストのみを使用してください。そうしないと、攻撃ベクトルが導入されます。
  • サイトが機密性の高い操作を実行する場合、単一の回答では対応できないため、実際に彼らが何をしているかを知っている人が必要です。HTTPS、HSTS、CSPを使用し、SQLインジェクション、スクリプトインジェクション(XSS)CSRF、およびプラットフォームに固有のその他のさまざまなもの(さまざまなフレームワークでの大量割り当ての脆弱性:ASP.NET MVCなど)を緩和する必要があります。Ruby on Railsなど)。「安全」(悪用できない)と「安全ではない」の違いをもたらすものは1つもありません。

HTTPSを介してPOSTデータがエンコードされますが、URLがサードパーティによって盗聴される可能性はありますか?

いいえ、盗聴することはできません。ただし、URLはブラウザの履歴に保存されます。

機密データをPOSTまたはGETにまとめて配置せず、代わりにサーバー側のコードを使用して機密情報を処理することを避けることがベストプラクティスと言えるでしょうか。

それがどれほど敏感であるか、より具体的にはどのように依存するかによって異なります。明らかにクライアントはそれを見るでしょう。クライアントのコンピュータに物理的にアクセスできる人なら誰でもそれを見ることができます。クライアントは、あなたに送り返すときに、なりすましを行う可能性があります。それらが重要であれば、はい、機密データをサーバーに保存し、そのままにしないでください。


29
ええと、CSRFはPOSTで可能な限りです。
AviD 2010

5
@Lotus Notes、これは少し難しいですが、XSSは必要ありません。POSTリクエストは常に場所全体に送信されます。CSRFは、XSSが含まれていない任意の Webサイトから取得できることを忘れないでください。
AviD 2010

18
ブラウザーで暗黙的にフェッチされるGETとは対照的に、タイプする権限を持つ他のユーザーを作成する必要はありません。すべてのPOSTフォームを検証可能なソースハッシュで保護する必要があること、およびGETリンクにそのような手段がないことを考えると、ポイントはばかげています。
キビッツァー2011年

7
まあ、すべてのGETリクエストにPOSTフォームに追加するのとまったく同じ方法でハッシュを追加できますが、データを変更するものにはGETを使用しないでください。
Eli

13
POST over GETを使用しても、いかなる種類のCSRFも妨げられません。URLからの画像を許可するランダムなWebサイトにユーザーを誘導する方が、(JavaScriptが十分にある)管理するWebサイトにアクセスするよりも簡単になるため、少し簡単になります。<body onload="document.getElementById('a').submit()"><form id="a" action="http://example.com/delete.php" action="post"><input type="hidden" name="id" value="12"></form>リンクをクリックする(そのhtmlを含む)ことにより、自動的にどこかに投稿を送信するのはそれほど難しいことではありません
FryGuy

175

変数はHTTP GETを介して送信される変数よりもHTTP POSTを介して送信されるため、セキュリティは向上しません。

HTTP / 1.1は、リクエストを送信するための一連のメソッドを提供します

  • オプション
  • 取得する
  • 役職
  • 置く
  • 削除
  • 痕跡
  • 接続する

GETを使用した次のHTMLドキュメントがあるとします。

<html>
<body>
<form action="http://example.com" method="get">
    User: <input type="text" name="username" /><br/>
    Password: <input type="password" name="password" /><br/>
    <input type="hidden" name="extra" value="lolcatz" />
    <input type="submit"/>
</form>
</body>
</html>

あなたのブラウザは何を尋ねますか?それはこれを尋ねます:

 GET /?username=swordfish&password=hunter2&extra=lolcatz HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

ここで、リクエストメソッドをPOSTに変更したとしましょう。

 POST / HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Content-Length: 49
 Cache-Control: max-age=0
 Origin: null
 Content-Type: application/x-www-form-urlencoded
 Accept: application/xml,application/xhtml+xml,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

 username=swordfish&password=hunter2&extra=lolcatz

これらのHTTPリクエストは両方とも次のとおりです。

  • 暗号化されていません
  • 両方の例に含まれています
  • 盗聴される可能性があり、MITM攻撃の対象となります。
  • サードパーティやスクリプトボットで簡単に複製できます。

多くのブラウザは、POST / GET以外のHTTPメソッドをサポートしていません。

多くのブラウザビヘイビアはページアドレスを保存しますが、これはこれらの他の問題を無視できるという意味ではありません。

具体的には:

1つは本質的により安全ですか?POSTはURLの情報を公開しないことに気づきましたが、その中に本当の価値はありますか、それともあいまいなことによる単なるセキュリティですか?ここでのベストプラクティスは何ですか?

これは正解です。HTTPを話すために使用しているソフトウェアは、1つの方法で要求変数を保存する傾向がありますが、別の方法では、ブラウザーの履歴や、h4x0r1ngを理解していると考えている10歳の人からの単純な攻撃を防ぐだけではありません。 、または履歴ストアをチェックするスクリプト。履歴ストアをチェックできるスクリプトがあれば、ネットワークトラフィックをチェックするスクリプトも簡単に作成できます。そのため、このあいまいさによるセキュリティ全体は、スクリプトキディや嫉妬深いガールフレンドにあいまいさを与えるだけです。

httpsではPOSTデータがエンコードされますが、URLがサードパーティによって盗聴される可能性はありますか?

SSLの仕組みは次のとおりです。上記で送信した2つのリクエストを覚えていますか?SSLでの表示は次のとおりです(example.comがSSLで応答しないため、ページをhttps://encrypted.google.com/に変更しました)。

SSL経由のPOST

q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?`2o?O4G5D12Aovo?C@?/P/oOEQC5v?vai /%0Odo
QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%TFyS@Or1SR/O/o/_@5o&_o
9q1/?q$7yOAXOD5sc$H`BECo1w/`4?)f!%geOOF/!/#Of_f&AEI#
yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti
/i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R
_o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c'
(_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ x?B?oO@&
Pw?os9Od!c?/$3bWWeIrd_?( `P_C?7_g5O(ob(go?&/ooRxR'u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r

SSL経由で取得

rV/O8ow1pc`?058/8OS_Qy/$7oSsU'qoo#vCbOO`vt?yFo_?EYif)
43`I/WOP_8oH0%3OqP_h/cBO&24?'?o_4`scooPSOVWYSV?H?pV!i
?78cU!_b5h'/b2coWD?/43Tu?153pI/9?R8!_Od"(//O_a#t8x?__
bb3D?05Dh/PrS6_/&5p@V f $)/xvxfgO'q@y&e&S0rB3D/Y_/fO?
_'woRbOV?_!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
_Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO_?Ww_dr"'DxHwo//P
oEfGtt/_o)5RgoGqui&AXEq/oXv&//?%/6_?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi'8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr'9/o_7too7q?c2Pv

(注:HEXをASCIIに変換しましたが、一部は表示できないはずです)

HTTP会話全体が暗号化され、通信の可視部分のみがTCP / IP層(IPアドレスと接続ポート情報を意味する)上にあります。

ここで、大胆な発言をします。あなたのウェブサイトは、あるHTTPメソッドよりも他のHTTPメソッドよりも優れたセキュリティを提供されていません。世界中のハッカーや初心者は、ここで説明したことを実行する方法を正確に知っています。セキュリティが必要な場合は、SSLを使用します。ブラウザは履歴を保存する傾向があります。アクションを実行するためにGETを使用しないことをRFC2616 9.1.1で推奨していますが、POSTがセキュリティを提供すると考えるのは間違いなく間違っています。

POSTがセキュリティ対策である唯一のことは何ですか?ブラウザーの履歴をめくる嫉妬の元に対する保護。それでおしまい。残りの世界はあなたに笑いながらあなたのアカウントにログインしています。

POSTが安全でない理由をさらに実証するために、FacebookはPOSTリクエストをいたるところに使用しているので、FireSheepなどのソフトウェアはどのようにして存在できるのでしょうか。

HTTPSを使用していて、サイトにXSSの脆弱性が含まれていない場合でも、CSRFで攻撃される可能性があることに注意してください。つまり、この攻撃シナリオでは、被害者(サイトまたはサービスのユーザー)がすでにログインしており、適切なCookieを持っていることを想定しており、被害者のブラウザが(おそらく安全な)サイトで何かをするように要求されます。CSRFに対する保護がない場合でも、攻撃者は被害者の資格情報を使用してアクションを実行できます。サーバーの応答は被害者のブラウザに転送されるため、攻撃者はサーバーの応答を見ることができませんが、被害は通常その時点ですでに行われています。


1
CSRFについて話さなかったのは残念です:-)。あなたに連絡する方法はありますか?
Florian Margaine、

@FlorianMargaineツイッターで私を追加し、私はあなたに私のメールをDMします。twitter.com/#!/BrianJGraham
シークレット

Facebookは安全だと誰が言ったのですか?良い答えですが。+1
Amal Murali 2013年

1
「[...]したがって、あいまいさによるこのセキュリティ全体は、スクリプトキディと嫉妬深いガールフレンドにあいまいさを提供するだけです。[...]」これは嫉妬深いgfのスキルに完全に依存します。さらに、gf / bfがブラウザの履歴にアクセスすることを許可しないでください。今まで。笑。
turkishweb 2016

34

追加のセキュリティはありません。

投稿データは履歴ファイルやログファイルには表示されませんが、データを安全に保つ必要がある場合は、SSLが必要です。
さもなければ、ワイヤーを盗聴した誰もがとにかくあなたのデータを読むことができます。


2
SSL経由でURLを
取得した

7
GET情報は、SSLトンネルの開始時と終了時にのみ表示できます
Jacco

1
また、システム管理者は、ログファイルを使用してgrepを実行します。
Tomalak、2008年

1
私はそこにあると言うでしょう、いくつかの POSTデータは、ユーザーのブラウザの履歴に保存されませんが、GETデータがすることでセキュリティを強化するには。
キップ

3
HTTP over SSL / TLS(正しく実装されている)を使用すると、攻撃者はワイヤーをスニッフィング(または積極的に改ざん)して、宛先のIPアドレスと双方向のデータ量の2つだけを確認できます。
アーロン

29

ログインフォームやその他の比較的機密性の高い情報を含むフォームの場合、POST実際のセキュリティ上の利点がにない場合でもGET、次のように使用しPOSTていることを確認してください。

  1. POSTed 情報はユーザーの履歴に保存されません。
  2. フォームで送信された機密情報(パスワードなど)は、後でURLバーに表示されなくなります(を使用GETすると、履歴とURLバーに表示されます)。

また、GETデータには理論上の制限があります。POSTしません。

実際の機密情報については、必ずSSLHTTPS)を使用してください


デフォルトの設定では、firefox / IEでユーザー名とパスワードを入力するたびに、この情報を保存するかどうかを尋ねるメッセージが表示されるので、後で入力する必要はありません。
Kibbee、2008年

アンドリューユーザー入力フィールドでのオートコンプリートを意味すると思います。たとえば、Firefoxは私のウェブサイトに入力したすべてのデータを記憶しているので、検索ボックスにテキストを入力し始めると、以前の検索でテキストを完成させることができます。
James McMahon、

そうですね、それがオートコンプリートのポイントですよね。私が意味したのは、オートコンプリートではなく、実際の歴史でした。
Andrew Moore、

攻撃者が完全なブラウザ履歴にアクセスできる場合、攻撃者は完全なブラウザのオートコンプリートデータにもアクセスできます。
ミッコランタライネン2013年

19

GETとPOSTのどちらも本質的に「より安全」ではありません。これは、FAXと電話のどちらも「より安全」ではないのと同じです。解決しようとしている問題に最も適切なものを選択できるように、さまざまなHTTPメソッドが提供されています。GETはべきクエリに対してより適切ですが、POSTは「アクション」クエリに対してより適切ですが、維持しているアプリケーションのセキュリティアーキテクチャを理解していなければ、どのクエリでも簡単に自分を撃つことができます。

それはあなたが読めば、おそらく最善ですメソッド定義:第9章HTTP / 1.1 RFCは、 GETとPOSTは、もともと平均otの想定されたものの全体的なアイデアを得るために。


16

GETとPOSTの違いは、セキュリティの観点からではなく、サーバーに対する意図の観点から見る必要があります。GETはサーバー上のデータを変更するべきではありません-少なくともログ以外は-ですが、POSTは新しいリソースを作成できます。

素敵なプロキシはPOSTデータをキャッシュしませんが、URLからのGETデータをキャッシュする可能性があるため、POSTの方がより安全であると言えます。しかし、POSTデータは、うまく再生されないプロキシでも引き続き利用できます。

多くの回答で述べられているように、唯一の確実な賭けはSSL経由です。

ただし、GETメソッドがデータベース行の削除などの変更をコミットしないことを確認してください。


1
これに同意する。問題はセキュリティではなく、それがPOSTとGETの目的です。
pbreitenbach 2009

6

私の通常の選択方法は次のようなものです。

  • URLによって後で 取得されるアイテムのGET
    • たとえば、検索はGETにする必要があるので、後でsearch.php?s = XXXを実行できます
  • 送信されるアイテムのPOST
    • これはGETに比較的見えず、送信が困難ですが、データはcURLを介して送信できます。

ただし、GETよりもPO​​STを実行する方困難です。GETはアドレスボックス内の単なるURLです。POSTでは、HTMLページまたはcURLに<form>が必要です。
pbreitenbach 2009

2
したがって、偽の投稿にはメモ帳と5分の時間がかかります...それほど難しくありません。メモ帳を使用して、存在しない電話システムに機能を追加しました。システムの管理フォームのコピーを作成することができました。これにより、ベンダーに関する限り、「不可能」であったボタンにコマンドを割り当てることができます。
マシューホワイト


6

どちらも魔法のようにリクエストにセキュリティを付与するわけではありませんが、GETは一般的にリクエストの安全性を妨げるいくつかの副作用を意味します。

GET URLはブラウザの履歴とウェブサーバーのログに表示されます。このため、ログインフォームやクレジットカード番号などには使用しないでください。

ただし、そのデータをPOSTするだけでは、データの安全も確保されません。そのためにはSSLが必要です。GETとPOSTはどちらも、HTTP経由で使用される場合、データをプレーンテキストで送信します。

データをPOSTする他の正当な理由もあります。たとえば、無制限の量のデータを送信したり、一般ユーザーからパラメータを隠したりする機能です。

欠点は、ユーザーがPOST経由で送信されたクエリの結果をブックマークできないことです。そのためには、GETが必要です。


5

この状況を考えてみましょう。ずさんなAPIは、次のようなGETリクエストを受け入れます。

http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1

一部の設定では、このURLをリクエストし、リクエストに関するエラー/警告がある場合、この行全体がログファイルに記録されます。さらに悪いことに、本番サーバーでエラーメッセージを無効にするのを忘れた場合、この情報はブラウザにそのまま表示されます。これで、APIキーを誰にでも配布できます。

残念ながら、実際のAPIはこのように機能しています。

ログに機密情報を含めたり、ブラウザに表示したりするのは嫌です。POSTとGETは同じではありません。必要に応じてそれぞれを使用してください。


3
  1. 転送中のデータの安全性としてのセキュリティ:POSTとGETの間に違いはありません。

  2. コンピューター上のデータの安全性としてのセキュリティ:POSTの方が安全です(URL履歴なし)


2

セキュリティの概念は、セキュリティで保護したいものを定義しない限り意味がありません。

保存されているブラウザの履歴、一部の種類のログ、およびユーザーのURLを監視する場合は、POSTの方が安全です。

誰かがあなたのネットワーク活動を盗聴するのを防ぎたいなら、違いはありません。


1

多くの人々は、GETリクエストがデータを取得するだけでサーバー上のデータを変更しないという規則(Rossが示唆)を採用しており、POSTリクエストはすべてのデータ変更に使用されます。1は、より本質的に、他のより安全なあなたがいる場合ではありませんが行うこの規則に従ってください、あなたは横断的なセキュリティロジックを適用することができます(アカウントを持つ例えば人だけがデータを変更することができますので、認証されていない投稿は拒否されます)。


4
実際、これは「標準」ではなく、HTTP標準の一部です。RFCは、さまざまな方法から何を期待するかについて非常に明確です。
John Nilsson、

実際、GETリクエストで状態を変更できるようにすると、ページをプリフェッチしているブラウザが、アクセスした可能性があると見なして、意図しないアクションを誤って実行する可能性があります。
ジェスタ

1

POSTリクエストを変更することは困難です(クエリ文字列を編集するよりも多くの労力が必要です)。編集:言い換えれば、それはあいまいさによるセキュリティのみであり、かろうじてそれです。


3
Firefoxのアドオンをいくつか使用して、クエリ文字列リクエストと同じくらい簡単にPOSTリクエストを変更できます。クッキーのデータを自分のコンテンツに変更することもできます。
stephenbayer 2008年

スクリプトキディの動作が遅くなることはありません。これは、スクリプトキディが常に試すタイプのことです。問題は、彼らが時々成功することです。
Jacco

2
ええと。Firefoxのアドオンの使用=クエリ文字列よりも多くの労力。
まぶたがない2008年

あなたの答えは、実際にはそうではないが、投稿を使用する方がより安全であるという誤った感覚を人々に与えます。悪い答え、悪い男。
Chris Marasti-Georg、

回答の意図をより明確にするために編集しました。うまくいけば、それが役立ちます。
まぶたがない2008年

1

他のすべての答えを繰り返すつもりはありませんが、まだ言及されていない1つの側面があります。それは、データが消えるという話です。どこにあるかわかりませんが...

基本的には、不思議なことに数日ごとにすべてのデータが失われ、その理由が誰にもわからなかったWebアプリケーションに関するものです。後でログを調べると、サイトがgoogleまたは他の任意のスパイダーによって検出されたことが判明し、「このエントリを削除する」や「本当によろしいですか?」など、サイトで見つかったすべてのリンクを喜んでGET(読み取り:GOT)しました。リンク。

実際には-これの一部が言及されています。これは、「GETではデータを変更せず、POSTでのみ変更する」の背後にあるストーリーです。クローラーはPOSTではなく、GETを喜んで実行します。robots.txtでさえ、クローラーの誤動作を防ぐことはできません。


1

また、サイトに他の外部サイトへのリンクが含まれている場合、GETを使用して制御できないため、サイトのリンクを押すと、そのデータが外部サイトのrefeererヘッダーに配置されます。したがって、GETメソッドを使用してログインデータを転送することは、常に大きな問題です。ログを確認するか、Googleアナリティクス(または同様のもの)を調べるだけで、簡単にアクセスできるようにログイン資格情報が公開される可能性があるため


1

RFC7231:

"URIは、セキュリティで保護されたリソースを識別した場合でも、保護されるのではなく共有されることを目的としています。URIは多くの場合、ディスプレイに表示され、ページの印刷時にテンプレートに追加され、さまざまな保護されていないブックマークリストに保存されます。したがって、含めることは賢明ではありません機密である、個人を特定できる、または開示するリスクがあるURI内の情報。

サービスの作成者は、機密データの送信のためにGETベースのフォームを使用しないでください。そのデータはリクエストターゲットに配置されるためです。多くの既存のサーバー、プロキシ、およびユーザーエージェントは、リクエストターゲットをサードパーティから見える可能性がある場所にログまたは表示します。そのようなサービスでは、代わりにPOSTベースのフォーム送信を使用する必要があります。」

このRFCは、GETを使用して機密データを送信してはならないことを明確に述べています。このため、一部の実装者は、GETリクエストのクエリ部分から取得したデータを同じように処理しない場合があります。私は自分でデータの整合性を保証するプロトコルに取り組んでいます。この仕様によると、GETデータの整合性を保証する必要はありません(これらの仕様に準拠している人がいないためです)。


1

以前一部の人々が言っ​​たように、HTTPSはセキュリティをもたらします。

ただし、GETは履歴に保存できるため、POSTはGETよりも少し安全です。

しかし、悲しいことに、POSTまたはGETの選択が開発者の責任ではない場合もあります。たとえば、ハイパーリンクは常にGETによって送信されます(JavaScriptを使用して投稿フォームに変換されない限り)。


0

GETは誰でも見ることができ(今でも肩にかけても)キャッシュに保存されるため、ポストを使用することの安全性は低くなります。暗号化ルーチンなしのポストは確実ではないため、SSLを使用する必要があります( https)


0

POSTのセキュリティが低下する理由の1つは、GETがデフォルトでログに記録され、パラメーターとすべてのデータがWebサーバーによってほぼ普遍的にログに記録されることです。

POSTはその反対で、ほとんどの場合ログに記録されないため、攻撃者のアクティビティを特定するのは非常に困難です。

私は「それは大きすぎる」という議論を購入しません。それは何もログに記録しない理由ではありません。少なくとも1KBは、ポップするまで弱いエントリポイントで作業している攻撃者を特定するのに長い道のりになるでしょう。任意のHTTPベースのバックドアが無制限の量のデータを黙って渡すことを可能にすることにより、二重のサービス停止。


0

違いは、GETがデータを開いて送信し、POSTを非表示にする(httpヘッダー内)ことです。

したがって、Googleのクエリ文字列のように、安全でないデータにはgetの方が適しています。Auth-dataはGETを介して送信されることはありません。POSTをここで使用してください。もちろん、テーマ全体はもう少し複雑です。詳細については、こちらの記事(ドイツ語)をご覧ください


0

最近、攻撃が公開されました。これにより、中間者が圧縮されたHTTPSリクエストのリクエストボディを明らかにすることができます。リクエストヘッダーとURLはHTTPによって圧縮されないため、GETリクエストはこの特定の攻撃からより安全に保護されます。

GETリクエストにも脆弱性があるモードがあります。SPDYはリクエストヘッダーを圧縮し、TLSはオプションの(まれに使用される)圧縮も提供します。これらのシナリオでは、攻撃を防ぐのが簡単です(ブラウザーベンダーは既に修正を提供しています)。HTTPレベルの圧縮はより基本的な機能であり、ベンダーがそれを無効にすることはほとんどありません。

これは、GETがPOSTよりも安全なシナリオを示す例にすぎませんが、この攻撃の理由からPOSTではなくGETを選択することはお勧めできないと思います。攻撃は非常に洗練されており、重要な前提条件が必要です(攻撃者は、要求コンテンツの一部を制御できる必要があります)。攻撃が有害であるシナリオでは、HTTP圧縮を無効にすることをお勧めします。


0

免責事項:以下のポイントは、API呼び出しにのみ適用され、WebサイトのURLには適用されません。

ネットワーク上のセキュリティ:HTTPSを使用する必要があります。この場合、GETとPOSTは同等に安全です。

ブラウザ履歴:Angular JS、React JSなどのフロントエンドアプリケーションの場合、API呼び出しはフロントエンドによって行われるAJAX呼び出しです。これらはブラウザ履歴の一部にはなりません。したがって、POSTとGETは同等に安全です。

サーバー側のログ:データマスキングとアクセスログ形式の書き込みセットを使用すると、リクエストURLからすべてまたは機密データのみを非表示にすることができます。

ブラウザコンソールでのデータの可視性:悪意のあるユーザーにとって、GETと同じくらいPOSTデータを表示することはほとんど同じことです。

したがって、適切なロギングプラクティスにより、GET APIはPOST APIと同じくらい安全です。あらゆる場所でPOSTを実行すると、不十分なAPI定義が強制されるため、回避する必要があります。


-2

Postは、メッセージ本文で送信されるため、SSLがインストールされている場合に最も安全です。

しかし、その下で使用する7ビットプロトコルはエスケープメントでハッキング可能であるため、これらの方法はすべて安全ではありません。レベル4のWebアプリケーションファイアウォールを介しても。

ソケットも保証はありません...ある方法ではより安全ですが。


-3

これは古い投稿ですが、いくつかの回答には反対したいと思います。機密データを転送する場合は、SSLを使用する必要があります。GETパラメータ(?userid = 123など)でSSLを使用する場合、そのデータはプレーンテキストで送信されます!POSTを使用して送信する場合、値はメッセージの暗号化された本文に入れられるため、ほとんどのMITM攻撃では読み取ることができません。

大きな違いは、データが渡される場所です。データがURLに配置されている場合、それは暗号化できないことだけが理にかなっています。それ以外の場合は、URLを読み取ることができるだけなので、サーバーにルーティングできません。これがGETの仕組みです。

つまり、SSLを介してPOSTでデータを安全に送信できますが、SSLを使用するかどうかにかかわらず、GETでは送信できません。


4
これはまったく正しくありません。SSLはトランスポート層プロトコルです。最初にサーバーに接続してから、すべてのアプリケーションデータを暗号化されたデータのバイナリストリームとして送信します。このスレッドを確認してください。answers.google.com
Simeon G

TCPDumpを実行すると、これが100%正しいことがわかります。サーバーに接続するには、暗号化されていないリクエストを送信する必要があります。これをGETとして実行すると、引数は最初のリクエストに追加されるため、暗号化されません。リンクした投稿の内容に関係なく、TCPDump(または同様の)を使用してこれをテストできます。
LVM 2012年

1
できた!Macでtcpdumpを実行したところです。そして、あなたの答えは100%間違っていました。使用したコマンドは次のとおりです。sudo tcpdump -w ssl.data -A -i en1 -n dst port 443次に、ssl.dataを確認すると、むちゃくちゃになっているのがわかりました。すべてのHTTPデータは暗号化されました。そして、通常の非SSL呼び出しが機能することを確認するために、私は次のように使用しました。 。私はこれを私のgmailとgoogle plus(HTTPSです)とgoogle.comのような非SSLページでテストしました。
Simeon G

私はネットワークの専門家ではないので、tcpdumpで間違ったコマンドを使用したと思われる場合は、遠慮なく訂正してください。
Simeon G

コマンドは手元にありませんが、Wireshark / Etherealで確認することもできます。
LVM

-3

POSTでもGET要求を受け入れます。user.nameやuser.passwdなどの入力を持つフォームがあるとします。これらはユーザー名とパスワードをサポートすることになっています。?user.name = "my user&user.passwd =" my password "を追加するだけの場合、「ログオンページをバイパスする」ことで要求が受け入れられます。

これに対する解決策は、サーバー側にフィルター(eとしてJavaフィルター)を実装し、文字列クエリがGET引数として渡されていないことを検出することです。


2
違います!これは、POSTを受け入れるコードがGETも受け入れるかどうかについて、バックエンドに完全に依存します。
Colin 't Hart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.