いつGETまたはPOSTメソッドを使用する必要がありますか?それらの違いは何ですか?


249

GETまたはPOSTメソッドを使用する場合の違いは何ですか?どちらがより安全ですか?それぞれの(不都合な)利点は何ですか?

同様の質問


2
Getにはボディがないため、実際には、より複雑な構造のクエリ文字列エンコード形式がないため、データ構造として名前->値のペアに制限されます。リクエストでより複雑なデータ構造(配列、オブジェクトなど)を処理する必要がある場合は、POSTおよびおそらくより高度なフォーマット(json / xml)を使用する必要があります。簡単に言うと、本当に必要がない限り、GETを使用しないでください(つまり、URL /リソースが検出可能でなければなりません)。
themihai

回答:


263

セキュリティの問題ではありません。HTTPプロトコルはGETタイプのリクエストをべきであると定義していますが、POSTには副作用がある場合があります。わかりやすい英語では、GETは変更せずに何かを表示するために使用され、POSTは何かを変更するために使用されることを意味します。たとえば、検索ページではGETを使用し、パスワードを変更するフォームではPOSTを使用する必要があります。

また、PHPは概念を少し混乱させることに注意してください。POSTリクエストは、クエリ文字列からリクエストボディを通じて入力を取得します。GETリクエストは、クエリ文字列から入力を取得するだけです。したがって、POSTリクエストはGETリクエストのスーパーセットです。あなたが使用することができます$_GETPOSTリクエストで、そしてそれも中に同じ名前のパラメータ持つことが意味をなすこと$_POSTと、$_GETその平均値の異なるものを。

たとえば、記事を編集するためのフォームがあるとします。article-idはクエリ文字列に含まれている可能性があります(したがって、を通じて利用可能です$_GET['id'])が、article-idを変更するとします。その後、新しいIDがリクエストの本文に存在する場合があります($_POST['id'])。わかりました、おそらくそれは最良の例ではありませんが、2つの違いを示していると思います。


13
GETとPOSTの違いには間違いなくセキュリティの側面があります。悪意のあるサイトは、任意のGETリクエストをイメージタグなどに貼り付けて、ユーザーに別のサーバーに対してGETを実行させることができます。このGETがotherserver / deletemyaccountのようなものである場合、悪いことが起こります。
フランクシュヴィー

2
つまり、$ _ POSTの内容は悪意のあるユーザーから魔法のように隠されているわけではありません。すべてのものプログラミングには明らかにセキュリティ面があります。
troelskn 2009

1
この投稿では、セキュリティへの影響については触れられていないため、質問には完全には答えていません。スペルミスの「pain English」が「plain English」に変更されていれば、上部は問題ありません。下の部分は追従するには難しすぎます。概して、私の投稿よりもはるかに優れています。:-)
Akrikos

1
「POSTリクエストは、クエリ文字列からリクエストボディを通じて入力を取得します。」私見これは正しくありません。どちらかの入力を使用するには、$ _ REQUESTを使用する必要があります。$ _POSTはURLエントリを取得しません。
Gunnar Bernstein

1
@Frank Schwieterman私はこの投稿が古いことを知っていますが、私のアカウントを削除することはべき等ではなく、getを使用するべきではありません。
凍りつくような素晴らしい2014

77

ユーザーがフォームに情報を入力して[送信]をクリックすると、ブラウザからサーバーに情報を送信する方法が2つあります。URL内、またはHTTPリクエストの本文内です。

前の例で使用されたGETメソッドは、名前と値のペアをURLに追加します。残念ながら、URLの長さは限られているため、この方法はパラメーターが少ない場合にのみ機能します。フォームが多数のパラメーターを使用する場合、またはパラメーターに大量のデータが含まれる場合、URLは切り捨てられる可能性があります。また、URLで渡されるパラメーターはブラウザーのアドレスフィールドに表示されますが、パスワードを表示するのに最適な場所ではありません。

GETメソッドの代替はPOSTメソッドです。このメソッドは、HTTPリクエストの本文内に名前と値のペアをパッケージ化します。これにより、URLがすっきりし、フォームの出力にサイズ制限がなくなります。また、より安全です。


1
どのようにしてより「安全」ですか?
Julian Reschke、2009

4
変えるのが難しいから?アドレスバーでGETを変更できますが、POSTでは簡単ではありません。
IAdapter 2009

8
サーバーはクライアントを信頼できません。誤った仮定に基づいてアプリケーションを設計することは、安全ではありません。
troelskn 2009

openidも壊れている可能性があるため、保存されませんか?
IAdapter 2009

1
これが最も明確な説明だと思います。送信されるデータの配置の違いです。ありがとうございました。
greenoldman

37

最良の答えは最初の答えでした。

あなたが使用しています:

  • データを取得したい場合はGET(GET DATA)。
  • POSTは、あなたは(POSTデータ)のデータを送信する場合。

2
要求/応答サービスパターンとは何ですか?両方を実行したいですか?;)応答を返す必要があるほとんどの場合、POSTを使用したいと思います。
ドミトリーパブロフ

8
一般的にはそうです。GETデータの「送信」も完全に可能であるため、あまり正確な答えではありません。
Patrick Hofman

23

の使用には、2つの一般的な「セキュリティ」の影響がありGETます。データはURL文字列に表示されるので、アドレスバー/ URLを覗き込む可能性のある誰かが、セッションを乗っ取るために使用される可能性のあるセッションCookieなど、表示すべきではないものを表示できる可能性があります。誰もがカメラ付き携帯電話を持っていることに注意してください。

のその他のセキュリティへの影響は、リクエストするURLの一部としてほとんどのWebサーバーのアクセスログに記録される変数GETに関係していGETます。状況、規制環境、データの一般的な感度によっては、これが懸念を引き起こす可能性があります。

一部のクライアント/ファイアウォール/ IDSシステムはGET、過剰な量のデータを含む要求に不快感を与える可能性があり、したがって信頼できない結果を提供する可能性があります。

POST Webサーバーへのファイルのアップロードに使用されるマルチパートバイナリ入力のサポートなどの高度な機能をサポートします。

POST送信されるデータのサイズを事前に把握しておく必要があるため、クライアント固有のシングルパスインクリメンタルモードでクライアントリクエストが形成されないようにするため、アプリケーション固有のクライアント実装の複雑さを増す可能性があるcontent-lengthヘッダーが必要です。おそらく、HTTPRPC(リモートプロシージャコール)トランスポートとして悪用することを選択した人にとっては、軽微な問題です。

他の人は、意味の違いとこの質問の「いつ」の部分をカバーするのにすでに良い仕事をしています。


17

URL から情報取得する場合はGETを使用、URLに情報送信する場合はPOST を使用します。


1
ただし、GETを使用して送信することもできます。違いは形式です(URL内(GET)またはリクエスト内(POST))。
エリック2017

エンドポイントがファイルを受け入れ、そのファイルから1行を返す場合(データの作成や変更、データベースが関係していない場合)、エンドポイントはGETまたはPOSTのどちらにする必要がありますか?
変数

17

データが多い場合、または機密情報の一種である場合はPOSTを使用する必要があります(本当に機密性の高いものには安全な接続も必要です)。

すべてのデータがブックマークに含まれているため、人々があなたのページをブックマークできるようにしたい場合は、GETを使用してください。

GETメソッドでREFRESHを押す人に注意してください。ユーザーに警告することなく毎回データが再送信されるためです(POSTはユーザーにデータの再送について警告することがあります)。


エンドポイントがファイルを受け入れ、そのファイルから1行を返す場合(データの作成や変更、データベースが関係していない場合)、エンドポイントはGETまたはPOSTのどちらにする必要がありますか?
変数

@変数POST。この場合、主にPOSTはファイルのアップロードを処理するように構築されており、標準のGETはそうではないためです。ページが読み込まれるたびにファイルを送信する必要があるため、GET + fileの代わりに標準のPOSTを使用することは理にかなっています。これは、URLが毎回同じ結果を与えるかどうかというGETの期待に反するものです。
付与

14

このW3Cドキュメントでは、HTTP GETおよびPOSTの使用について説明しています。

信頼できる情報源だと思います。

概要は次のとおりです(ドキュメントのセクション1.3):

  • インタラクションが質問に近い場合(つまり、クエリ、読み取り操作、ルックアップなどの安全な操作である場合)は、GETを使用します。
  • 次の場合はPOSTを使用します。
    • 相互作用は注文のようなものです
    • 相互作用により、ユーザーが認識する方法でリソースの状態が変更されます(たとえば、サービスへのサブスクリプション)。
    • ユーザーは、対話の結果に対して責任を負います。

9
これは、次のようにさらに要約できると思います。サーバーの状態が変更されていない場合はGET、変更されている場合はPOSTです。
ヤムチャ

10

GetおよびPostメソッドは、使用しているサーバーテクノロジーとは何の関係もありません。php、asp.net、rubyでも同じように機能します。GETおよびPOSTはHTTPプロトコルの一部です。マークが指摘したように、POSTはより安全です。POSTフォームもブラウザによってキャッシュされません。POSTは、大量のデータの転送にも使用されます。


8

データを変更するときにPOSTを使用する理由:

  • Google Web AcceleratorのようなWebアクセラレータは、ページ上のすべての(GET)リンクをクリックし、それらをキャッシュします。リンクが物事に変更を加える場合、これは非常に悪いです。
  • ブラウザはGETリクエストをキャッシュするため、ユーザーがリンクをクリックしても、変更を実行するリクエストをサーバーに送信しない場合があります。
  • サイト/アプリケーションをCSRFから保護するには、POSTを使用する必要があります。アプリを完全に保護するには、サーバーで一意の識別子を生成し、それをリクエストで送信する必要もあります。

また、機密情報をクエリ文字列に含めないでください(GETのオプションのみ)。アドレスバー、ブックマーク、サーバーログに表示されるためです。

うまくいけば、これがPOSTが「安全」だと人々が言う理由を説明しています。機密データを送信する場合は、SSLを使用する必要があります。


8

GETおよび同様の目標達成できるPOST HTTPメソッドです

GET基本的には、データを取得(取得)するためのものです。AにGETは本文を含めないでください。したがって、Cookieを除いて、情報を渡す唯一の場所はURLであり、URLの長さが制限されており、送信GETPOSTれるデータがURL

GETパスワード、クレジットカード、その他の機密情報を送信する場合は絶対に使用しないでください。データはURL内のすべてのユーザーに表示されます。データはキャッシュできます。 GETボタンをリロードしたりコールバックしたりしても無害です。ブックマークが付けられ、パラメータはブラウザの履歴に残り、ASCII文字のみが許可されます。

POSTデータの保存や更新、製品の注文、電子メールの送信など、何かが含まれる場合があります。POSTメソッドには本体があります。

POSTこのメソッドは、機密情報をサーバーに渡すために保護されており、URLのクエリパラメータには表示されず、パラメータはブラウザの履歴に保存されません。データ長に制限はありません。ブラウザをリロードすると、データが再送信されようとしていることをブラウザがユーザーに警告するはずです。POSTメソッドはブックマークできません


3
  1. GETメソッドは機密性の低いデータを送信するために使用され、POSTメソッドは機密性の高いデータを送信するために使用されます。
  2. POSTメソッドを使用すると、GETメソッドに比べて大量のデータを送信できます。
  3. GETメソッドによって送信されたデータはブラウザーのヘッダーバーに表示されますが、POSTメソッドによって送信されたデータは表示されません。

0

URLからリソースを取得する場合は、GETメソッドを使用します。ブラウザの戻るボタンを押すと常に最後のページが表示され、ブックマークが付けられる可能性があるため、POSTメソッドほど安全ではありません。

URLに何かを「送信」する場合は、POSTメソッドを使用します。たとえば、Googleアカウントを作成し、すべての詳細情報を入力する必要がある場合、「送信」ボタンをクリックし(POSTメソッドはここで呼び出されます)、送信が成功したら、ブラウザの「戻る」ボタンを押してみます、フォームが入力された最後のページではなく、エラーまたは新しい空白のフォームが表示されます。


-10

GET方法:

  • 256文字の日付の送信にのみ使用されます

  • この方法を使用すると、ブラウザで情報を確認できます

  • フォームで使用されるデフォルトの方法です

  • それほど安全ではありません。


POST方法:

  • 無制限のデータを送信するために使用されます。

  • この方法では、ブラウザで情報を見ることができません

  • POSTメソッドを明示的に述べることができます

  • GETメソッドよりも安全です

  • より高度な機能を提供します


「これは256文字の日付を送信するためにのみ使用されます」—真実ではありません。「この方法を使用すると、情報はブラウザーで確認できます」—投稿データはブラウザーでも表示されますが、それほど明確ではありません。「より高度な機能を提供します」など。
クエンティン

これはそれほど有用な答えではありません。「それほど安全ではない」、「より高度な機能を提供する」などの誤った情報、およびQuentinによって言及されたその他の情報。
Andrew Barberが
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.