これら2つの方法を使用することについて、すべての長所と短所を知りたい. 特に、Web セキュリティへの影響。
ありがとう。
それらから選択するには、次の単純なルールを使用します。
読み取り用の GET。(データを読み込んで表示する)
書き込みを行うすべての POST (つまり、データベース テーブルの更新、エントリの削除など)
もう 1 つの考慮事項は、GET は URI の最大長の影響を受け、もちろんファイルのアップロードを処理できないことです。
GET と POST の両方にそれぞれの役割があります。セキュリティのためにそれらのいずれにも依存しないでください。
GET リクエスト
POST リクエスト
フォーム送信の結果をブックマーク可能にしたいですか (Google 検索を考えてください)。GETを使用します。
フォーム送信の結果をキャッシュ可能にしますか? GETを使用します。
リクエストは冪等ではありませんか (安全に繰り返し可能ですか)。POSTを使用してから、常に HTTP GET 経由で取得するのに適したページにリダイレクトします。
ファイルのアップロードが必要ですか? POSTを使用します。
GET に副作用があってはなりません: http://www.w3.org/DesignIssues/Axioms.html#state
投稿に副作用がある場合は、POST フォームを使用する必要があります。
どちらの方法もセキュリティに実際の影響はありません。セキュリティが心配な場合は SSL を使用してください。
Micke などからの素晴らしい回答に加えて、ブラウザー インターフェイスが GET と POST で要求されたページを処理する方法の重要な違いを指摘したいと思います。
GET 要求されたページをリロードすると、ブラウザーは (サーバーまたはキャッシュから) URL を再度取得するだけですが、POST をリロードすると、ブラウザーはデータの再投稿に関するやや紛らわしい警告ポップアップを表示します。次にキャンセルします(さらに紛らわしい「期限切れ」ページにつながります)。back または history を使用して、POST の結果であるページに戻る場合も同じです。
もちろん、これは異なるセマンティクスに基づいています。GET リクエストは冪等であると想定されています。つまり、何も変更せずに何度でも実行できます。一方、POST は、何かにサインアップしたり、何かに署名したり、フォーラムにコメントを投稿したりするなど、副作用のあるアクション用です。通常、ユーザーはリロード時にこのアクションを繰り返すことを期待していないため、警告は賢明です。ただし、アクションが安全に反復可能 (検索など) である場合は、POST を使用しないでください。警告は必要なく、ユーザーを混乱させるだけだからです。
セキュリティに関するポイント: GET フォームにパスワード フィールドがある場合、パスワードを入力すると、覗き見されないようにパスワードがマスクされますが、送信を押すと、アドレス バーにはっきりと表示されます。ただし、それ以外は、GET と POST のどちらにも実際のセキュリティはありません。そのため、懸念がある場合は SSL を使用してください。
HTTPのGETメソッドとPOSTメソッドは、HTTP(Hyper Text Transfer Protocol)プロトコルを使用してクライアントからサーバーにデータを転送するために使用される最も一般的な2つのメソッドです。GETとPOSTはどちらも要求の送信と応答の受信に使用できますが、両者には大きな違いがあります。
GET HTTPリクエストとは何ですか? HTTPプロトコルは、HTTPまたはHTTPSプロトコルを使用してリクエストを送信するときに使用できるいくつかのリクエストメソッドをサポートしています。GETはその1つです。名前が示すように、GETメソッドはHTTPサーバーからページを取得することです。GETリクエストの重要なプロパティの1つは、リクエストパラメータまたはクエリパラメータがURLエンコードされた文字列として渡され、「?」を使用して追加されることです。URL文字列で渡す情報はすべての人に表示されるため、安全性が低くなります。
HTTPGETリクエストを使用する場合 先ほど述べたように、GETメソッドは安全ではないため、機密データの転送には適していませんが、GETメソッドはWebサーバーから静的コンテンツを取得するのに非常に役立ちます。GETメソッドを使用することが理にかなっているいくつかの例を次に示します。繰り返し要求しても副作用はありません。たとえば、別のページを指すリンクをクリックします。リンクを2回クリックするか3回クリックするかは関係ありません。これにより、サーバーのブラウザが応答をキャッチして、より高速に取得できるようになります。機密情報を渡してはいけません。代わりに、構成データまたはセッションIDを渡すだけです。HTTPGETリクエストが指すURLをブックマーク可能にする必要があります。サーバーに送信する必要のあるデータは大きくなく、すべてのブラウザでサポートされている最大長のURLに安全に対応できます。
POSTHTTPメソッドとは POST HTTPリクエストは、メソッド:HTTPリクエストのPOSTで示されます。POSTメソッドでは、データはURL文字列の一部としてサーバーに送信されませんが、POSTでは、データはメッセージ本文の一部として送信されます。ほとんどすべての認証要求は、HTTPの世界ではPOSTメソッドを介して送信されます。データはURL文字列に表示されないため、POSTメソッドは安全であり、セキュリティを強化するためにHTTPSを使用して安全に暗号化できます。サーバーに送信されるすべての機密情報は、POSTリクエストとHTTPS(HTTP with SSL)を介して送信される必要があります。POSTメソッドは、サーバーへの情報の送信にも使用されます。ショッピングカートへのアイテムの追加、支払いなど、アプリケーションの状態を変更する可能性のある情報は、HTTPリクエストでPOSTメソッドの使用を検討する必要があるいくつかの例です。 GETの場合、URLに収まらない大きなデータを送信します。user_id、パスワード、アカウント番号などの機密情報をサーバーに渡す場合はPOSTメソッドを使用します。支払い処理のためにカートにアイテムを追加するなど、アプリケーションの状態を変更する可能性のあるデータを送信する場合は、POSTメソッドを使用します。安全なアプリケーションを作成していて、URLにクエリパラメータを表示したくない場合は、POSTを使用してください。
HTTPプロトコルでのGETメソッドとPOSTメソッド の違いGETとPOSTの違いのほとんどは、それぞれのセクションですでに説明されています。GETとPOSTを選択する場合はすべて要件によって異なり、これらの違いに関する知識がその決定に役立ちます。
GETメソッドはURL文字列でリクエストパラメータを渡しますが、POSTメソッドはリクエスト本文でリクエストパラメータを渡します。GETリクエストは限られた量のデータしか渡すことができませんが、POSTメソッドは大量のデータをサーバーに渡すことができます。POSTリクエストとは異なり、GETリクエストはブックマークしてキャッシュできます。GETは主に表示目的(SQL SELECTなど)に使用され、POSTは主に更新目的(SQL INSERTやUPDATEなど)に使用されます。
GET は URL でデータを渡し、POST は同じデータを HTTP コンテンツで渡します。どちらもセキュリティの観点からはまったく同じです (つまり、HTTPS を使用するなど、自分で何かをしない限り、完全に安全ではありません)。
GET は、ブラウザーと Web サーバーでサポートされる URL の最大長によって制限されるため、短い形式でのみ使用できます。
HTTP 標準の観点から、GET リクエストはサイトを変更すべきではなく、ブラウザ/スパイダーは POST リクエストよりも (ユーザーが実際に何かをクリックすることなく) 独自に GET リクエストを行う可能性がはるかに高くなります。
パスワードやその他の機密情報などを渡す場合は、常に POST を使用し、SSL を使用していることを確認して、データがクライアントとサーバー間で平文で移動しないようにしてください。
セキュリティ上の観点から、GET を使用することの欠点は、送信されたすべてのデータが URL に含まれるため、クライアントのブラウザ履歴にローカルに保存されることです。
転送するデータの種類とサイズによって異なります。GET を使用すると、最大 255 文字をアクション ページに渡すことができます。POST メソッドを使用すると、そのような制限はありません。POST は、データがどこにも表示されないため、データのプライバシーを保護します。GET メソッドを使用して送信したものはすべて、ブラウザのアドレス バーに表示されます。
検索サイトの多くは通常、GET メソッドを使用します。これにより、検索クエリをブックマークする機能が提供されます。お役に立てれば。
見過ごされがちな GET のセキュリティ上の問題の 1 つは、Web サーバー ログにすべてのページ アクセスの完全な URL が含まれていることです。GET リクエストの場合、これにはすべてのクエリ パラメータが含まれます。これは、サイトに安全にアクセスした場合でも、プレーン テキストでサーバー ログに保存されます。
サーバー ログはサイト統計アプリでよく使用されるため、サーバー管理者だけがログを確認するわけではありません。
同じ注意事項が、Google アナリティクスなどのサード パーティの追跡ソフトウェアにも適用されます。これらのソフトウェアは、GET クエリ パラメータを含むページの完全な URL を記録し、それをアナリティクス ユーザーに報告します。
したがって、機密データ (パスワード、カード番号など) を送信する場合は、それが AJAX 経由であり、ブラウザーの実際の URL バーに表示されない場合でも、常に POST を使用する必要があります。
結果をブックマーク可能にする場合は、GET を使用します。
追加のツールを使用しなくても、送信されたすべての値をアドレス バーで監視できるため、GET の方がデバッグしやすいかもしれません。ただし、上限に制限があります。長さなので、いくつかの変数を使用すると、これを超える可能性があります。
最近の POST は、Fiddler などの無料ツールを使用しているため、それほど安全ではありません。値を非常に簡単に把握できます。ただし、この方法で送信できる値の長さや量に実際の制限はなく、URL はよりユーザーフレンドリーに見えます。
したがって、GET の代わりに POST を使用することを常に提案します。
David Mの答えは私の投票です。
聞いた話、都市伝説かも??
Web サイト上のファイルを削除するための内部使用のみのリンクを含むサイトを持っている人がいます。ウェブスパイダー (Google だったと思います) が何らかの形でこれらのリンクを見つけ、それぞれのリンクを楽しそうにたどり、サイト上のすべてのファイルを削除するまで、すべては順調でした。リンクは GET を使用し、スパイダーは POST リンクをたどらないため、POST を使用する必要がありました。
Google 検索エンジンは GET フォームの例です。これは、2 回続けて検索でき、結果に影響を与えないようにする必要があるためです。また、他のアドレスと同様に通常の GET リクエストであるため、検索結果ページにリンクできるという優れた効果もあります。
前述のように、データの削除または更新には POST を使用しますが、ユーザーをすぐに GET ページにリダイレクトする必要があることを付け加えたいと思います。
先日気づいた1つの問題は、本当の「DUH!」でした。私にとっての瞬間。
私たちのサイトにはサードパーティの検索エンジンがあり、GET メソッドを使用して検索クエリをコードに投稿しています。さらに、クエリ文字列で SQL インジェクション攻撃の可能性を探すコードがいくつかありました。私のコードは、「EXEC」、「UPDATE」、「DELETE」などの単語を探していたため、すべてを台無しにしていました。ユーザーが「EXECUTIVE MBA」を探していたことが判明し、私のコードは「EXECUTIVE」で「EXEC」を見つけました。 」とIPを禁止しました。
信じてください、私は自分のコードを自慢しているわけではなく、GET と POST のどちらを選択するかということは、「パスワードをクエリ文字列に表示させたいか」以外にも、かなり広範囲に及ぶ意味があると言っているだけです。
通常、POST を使用するのが最適です。これは、スヌーピングのために隠されていることが少し良く、一部のブラウザーでのフィールドのスペース/エンコーディングの処理が改善されており、特に GET フィールドの全体の長さに制限があるためです。
両方の値のセットは、ハッカーやその他のものによって簡単に監視されますが、GET は、値が何であるか (アドレスバーの右) が非常に目に見えるという点で安全性が低くなります。
必要な場合は、セキュリティのために SSL を使用してください。
良いアドバイス: フォームには常に POST を使用し、何かを投稿するのではなく、製品ページなどの特定のページを取得しようとしている場合は、クエリ文字列 (?value=products) を使用してください。したがって、名前は POST および GET :)