GET ではなく HTTP POST または DELETE を使用して削除する必要があるのはなぜですか?
-
16-09-2019 - |
質問
私は Microsoft の ASP.NET MVC チュートリアルを進めてきましたが、最終的にこのページにたどり着きました。
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx
このページの下部には次のような記述があります。
一般に、Web アプリケーションの状態を変更するアクションを呼び出すときに、HTTP GET 操作を実行する必要はありません。削除を実行するときは、HTTP POST、またはできれば HTTP DELETE 操作を実行する必要があります。
これは本当ですか?この声明の背後にある理論的根拠について、より詳細な説明を提供できる人はいますか?
編集
ウィキペディア は次のように述べています。
一部のメソッド (HEAD、GET、OPTIONS、TRACE など) は安全であると定義されています。これは、それらのメソッドが情報の取得のみを目的としており、サーバーの状態を変更すべきではないことを意味します。
対照的に、POST、PUT、DELETE などのメソッドは、サーバー上で副作用を引き起こす可能性のあるアクションを目的としています。
解決
Jon Skeet の答えが標準的な答えです。しかし:リンクがあるとします。
href = "\myApp\DeleteImportantData.aspx?UserID=27"
そしてGoogleボットがやって来てあなたのページをインデックスに登録しますか?それでは何が起こるでしょうか?
他のヒント
従来、GET には副作用はありません。つまり、状態は変更されません。つまり、結果をキャッシュしたり、ブックマークを安全に作成したりできるということです。
実装者は、 ソフトウェアは、 インターネットを介したやり取り ユーザーが次のことを行えるように注意する必要があります 彼らが行う可能性のある行動に注意してください 予想外の 自分自身や他人にとっての重要性。
特に、この大会は GETとHEADが メソッドは、 行動を起こすことの意義 その他 検索よりも。これらのメソッドは、 「安全」と見なされます。これにより、ユーザーは エージェントは他のメソッドを表し、 POST、PUT、DELETEなど、 ユーザーが作られるように、特別な方法 可能性があるという事実を認識しています。 安全でないアクションが要求されています。
当然のことながら、 サーバーが の結果として副作用を生成する GETリクエストを実行する。実際 一部の動的リソースでは、 特徴。重要な違い ここでは、ユーザーが要求していないことが したがって、副作用はできません 彼らに責任を負わなければならない。
冪等性に関する純粋主義的な問題とは別に、実用的な側面があります。スパイダー/ボット/クローラーなどがハイパーリンクをたどります。「削除」アクションが GET を実行するハイパーリンクとして設定されている場合、Google はすべてのデータを問題なく削除できます。見る "運命のスパイダー".
投稿の場合、これはリスクではありません。
もう一つの例..
http://example.com/admin/articles/delete/2
ログインしていて適切な権限を持っている場合、これにより記事が削除されます。たとえば、サイトがコメントを受け入れ、ユーザーがそのリンクを画像として送信した場合。そのようです:
<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>
次に、あなた自身が管理者ユーザーとしてサイトのコメントを閲覧しに来ると、ブラウザはその URL にリクエストを送信してその画像を取得しようとします。ただし、ブラウザがこれを実行している間はログインしているため、記事は削除されます。
ほとんどのブラウザでは画像が見つからないと何も表示されないため、ソース コードを見ないと気付かないかもしれません。
それが理にかなっていることを願っています。
ここで私の答えをご覧ください. 。この質問にも同様に当てはまります。
- プリフェッチ: 多くの Web ブラウザはプリフェッチを使用します。つまり、 それはあなたの前にページをロードします リンクをクリックします。それを予想して 後でそのリンクをクリックします。
- ボット: インターネットをスキャンしてインデックスを作成するボットがいくつかあります。 情報。GET のみを発行します 要求。削除したくない これに対するGETリクエストからの何か 理由。
- キャッシング: GET HTTP リクエストは状態を変更することは想定されておらず、冪等である必要があります。冪等とは、 要求を一度だけ発行する、または要求を発行する 複数回同じ結果が得られます。つまり、副作用はありません。対して この理由 GET HTTP 要求は キャッシングに密接に結びついています。
- HTTP標準はそう言っています:HTTP標準では、各HTTPメソッドが何であるかが規定されています 対して。いくつかのプログラムは、 HTTP 標準を使用し、 あなたがそれをあなたのように使うこと と思われています。だからあなたは持っているでしょう 多数の 従わない場合はランダムなプログラム。
スパイダーとリクエストは冪等である必要があることに加えて、get リクエストにはセキュリティの問題もあります。誰かが簡単にユーザーに電子メールを送信できます。
<img src="http://yoursite/Delete/Me" />
テキスト内に入力すると、ブラウザは喜んでそれに応じてリソースにアクセスしようとします。POST を使用することがそのような問題を解決するわけではありません (JavaScript でフォームの投稿を非常に簡単にまとめることができるため) が、良いスタートにはなります。
このトピック (HTTP メソッドの使用法) については、次のブログ投稿を読むことをお勧めします。 http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/
これは実際には逆の問題です。データが変更されていないときに POST を使用しないのはなぜですか。
インターネット バンキング アプリケーションがあり、送金ページにアクセスしたとします。ログインしたユーザーは、10 ドルを別のアカウントに送金することを選択します。
送信ボタンをクリックすると、(GET リクエストとして) にリダイレクトされます。 https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j
しかし、インターネット接続が遅い、またはサーバーがビジーであるため、送信ボタンを押した後、新しいページの読み込みが遅くなります。
ユーザーはイライラして、猛烈に F5 (ページの更新) を押し始めます。何が起こると思いますか?複数の転送が発生し、ユーザーのアカウントが空になる可能性があります。
ここで、リクエストが POST (または GET 以外) として行われた場合、最初の F5 (ページの更新) でユーザーはブラウザーに「本当に実行しますか?」と優しく尋ねます。副作用がある可能性があります [ なんとか ]...」
ここで説明した優れた理由とは別に、GET リクエストは受信側サーバーによってログに記録される可能性があります。 access.log
. 。リクエスト内でパスワードなどの機密データを送信すると、それらは平文として記録されます。
たとえ安全な DB ストレージのためにハッシュ/ソルト処理されていたとしても、侵害 (または IT 担当者の肩越しに誰かが覗いていること) によって、それらが暴露される可能性があります。このようなデータは POST 本文に含める必要があります。
GET に関するもう 1 つの問題は、コマンドがブラウザのアドレス バーに移動することです。したがって、ページを更新すると、「最後の内容を削除する」、「注文を送信する」などのコマンドを再度発行することになります。