web-dev-qa-db-ja.com

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

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

同様の質問

214
Adriana

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

また、PHPは概念を少し混乱させることに注意してください。 POST要求は、クエリ文字列から要求本文を介して入力を取得します。 GETリクエストは、クエリ文字列から入力を取得するだけです。したがって、POSTリクエストはGETリクエストのスーパーセットです。 POSTリクエストで$_GETを使用できます。また、$_POST$_GETに同じ名前のパラメーターを持たせることも意味があります。

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

234
troelskn

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

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

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

75
IAdapter

一番の答えは最初のものでした。

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

  • GETデータを取得する場合(GET DATA)。
  • POSTデータを送信する場合(POST DATA)。
37
alex

GETの使用には、2つの一般的な「セキュリティ」の意味があります。 URL文字列にデータが表示されるため、アドレスバー/ URLで肩越しに見ている人が、セッション乗っ取りに使用される可能性のあるセッションCookieなど、自分が見たくないものを表示できる可能性があります。 everyoneにはカメラ付き携帯電話があります。

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

一部のクライアント/ファイアウォール/ IDSシステムは、大量のデータを含むGETリクエストで眉をひそめる可能性があり、そのため信頼性の低い結果を提供する場合があります。

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

POSTにはコンテンツ長ヘッダーが必要です。送信されるデータのサイズが事前にわかっている必要があるため、クライアントリクエストがシングルパスインクリメンタルモードでのみ形成されるのを防ぐため、アプリケーション固有のクライアント実装の複雑さが増します。おそらく、HTTPをRPC(リモートプロシージャコール)トランスポートとして使用することでHTTPを悪用することを選択した場合の小さな問題です。

他の人は、セマンティックの違いとこの質問の「いつ」の部分をカバーするのにすでに良い仕事をしました。

19
Einstein

情報を取得するときにGETを使用しますfrom URLおよび情報を送信するときにPOST to URL。

17
Mark Biek

大量のデータがある場合はPOSTを使用するか、機密情報を並べ替えます(機密情報には安全な接続も必要です)。

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

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

15
Grant

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

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

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

  • インタラクションが質問に似ている場合(つまり、クエリ、読み取り操作、検索などの安全な操作)にGETを使用します。
  • 使用するPOSTif:
    • インタラクションは注文に似ている、または
    • インタラクションは、ユーザーが知覚する方法でリソースの状態を変更します(たとえば、サービスのサブスクリプション)、または
    • ユーザーは、相互作用の結果に対して責任を負います。
13
chus

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

10
sarsnake

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

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

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

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

8
Sarel Botha

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

GETは基本的にデータを取得(取得)するためのものです。AGETは本文を持ちません。そのため、Cookieを除き、情報を渡す唯一の場所はURLで、URLの長さは制限されますGETは、送信されるデータがURLの一部であるため、POSTと比較して安全性が低くなります

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

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

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

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

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

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

0
rObOtAndChalie