39

私はMicrosoftのASP.NETMVCチュートリアルに取り組んできましたが、このページに行き着きました

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

このページの下部に次のステートメントがあります。

一般に、Webアプリケーションの状態を変更するアクションを呼び出すときにHTTPGET操作を実行することは望ましくありません。削除を実行するときは、HTTP POST、さらにはHTTPDELETE操作を実行する必要があります。

これは本当ですか?誰かがこの声明の背後にある理論的根拠についてより詳細な説明を提供できますか?

編集

ウィキペディアは次のように述べています。

一部のメソッド(HEAD、GET、OPTIONS、TRACEなど)は安全であると定義されています。つまり、これらのメソッドは情報の取得のみを目的としており、サーバーの状態を変更することはできません。

対照的に、POST、PUT、DELETEなどのメソッドは、サーバーに副作用を引き起こす可能性のあるアクションを対象としています。

4

10 に答える 10

64

ジョンスキートの答えは、標準的な答えです。しかし:あなたがリンクを持っているとしましょう:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

そして、google-botがやって来て、あなたのページにインデックスを付けますか?それではどうなりますか?

于 2009-04-24T14:30:17.677 に答える
53

GET には通常、副作用がありません。つまり、状態を変更しません。つまり、結果をキャッシュしたり、ブックマークを安全に作成したりできます。

HTTP 1.1 RFC 2616から

実装者は、ソフトウェアがインターネット上での対話においてユーザーを表していることを認識する必要があり、ユーザー自身や他のユーザーにとって予想外の重要性を持つ可能性のある行動をユーザーが認識できるように注意する必要があります。

特に、GET メソッドと HEAD メソッドは、検索以外のアクションを実行するという意味を持つべきではないという規則が確立されています。これらの方法は「安全」であると考えるべきです。これにより、ユーザー エージェントは、POST、PUT、DELETE などの他のメソッドを特別な方法で表すことができるため、安全でない可能性のあるアクションが要求されているという事実をユーザーに認識させることができます。

当然のことながら、サーバーが GET 要求を実行した結果として副作用を生成しないことを保証することはできません。実際、一部の動的リソースはそれを機能と見なしています。ここでの重要な違いは、ユーザーが副作用を要求したわけではないため、副作用について責任を負うことはできないということです。

于 2009-04-24T14:26:41.773 に答える
20

べき等であることに関する純粋主義者の問題とは別に、実用的な側面があります。スパイダー/ボット/クローラーなどがハイパーリンクをたどります。GETを実行するハイパーリンクとして「削除」アクションがある場合、Googleはすべてのデータを楽しく削除できます。「運命の蜘蛛」を参照してください。

投稿の場合、これはリスクではありません。

于 2009-04-24T14:29:25.480 に答える
16

もう一つの例..

http://example.com/admin/articles/delete/2

ログインしていて適切な権限を持っている場合、これにより記事が削除されます。たとえば、サイトがコメントを受け入れ、ユーザーがそのリンクを画像として送信した場合。そのようです:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

次に、管理者ユーザーとしてサイトのコメントを閲覧すると、ブラウザはその URL にリクエストを送信してその画像を取得しようとします。ただし、ブラウザがこれを行っている間にログインしているため、記事は削除されます。

ほとんどのブラウザーは、画像が見つからない場合は何も表示しないため、ソース コードを見なければ気付かないこともあります。

それが理にかなっていることを願っています。

于 2011-03-11T17:08:13.793 に答える
12

ここで私の答えを見てください。これはこの質問にも同様に当てはまります。

  • プリフェッチ:多くのWebブラウザはプリフェッチを使用します。つまり、リンクをクリックする前にページが読み込まれます。後でそのリンクをクリックすることを期待しています。
  • ボット:インターネットをスキャンしてインデックスを作成し、情報を入手するボットがいくつかあります。GETリクエストのみを発行します。このため、GETリクエストから何かを削除する必要はありません。
  • キャッシング: GET HTTPリクエストは状態を変更することは想定されておらず、べき等である必要があります。べき等とは、リクエストを1回発行するか、複数回発行しても同じ結果が得られることを意味します。つまり、副作用はありません。このため、GETHTTPリクエストはキャッシングと密接に関連しています。
  • HTTP標準はそう言っています:HTTP標準は各HTTPメソッドが何のためにあるかを言います。いくつかのプログラムはHTTP標準を使用するように構築されており、想定どおりに使用することを前提としています。したがって、従わないと、多数のランダムなプログラムから未定義の動作が発生します。
于 2009-04-24T14:29:28.350 に答える
4

スパイダーとリクエストが冪等でなければならないことに加えて、get リクエストにはセキュリティ上の問題もあります。誰かがあなたのユーザーに電子メールを簡単に送信できます

<img src="http://yoursite/Delete/Me" />

と入力すると、ブラウザは喜んでリソースにアクセスしようとします。POST を使用しても、そのような問題を解決することはできませんが (JavaScript でフォーム投稿を簡単に作成できるため)、良い出発点となります。

于 2009-04-24T18:07:54.813 に答える
3

このトピック(HTTPメソッドの使用法)については、次のブログ投稿を読むことをお勧めします:http: //blog.codevader.com/2008/11/02/why-learning-http-does-matter/

これは実際には反対の問題です。データが変更されていないときにPOSTを使用しないのはなぜですか。

于 2009-04-24T14:30:04.853 に答える
2

インターネット バンキング アプリケーションがあり、送金ページにアクセスしたとします。ログインしたユーザーは、$10 を別の口座に送金することを選択します。

送信ボタンをクリックすると、(GET リクエストとして) https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2jにリダイレクトされます

しかし、インターネット接続が遅いか、サーバーがビジーであるため、送信ボタンを押した後、新しいページの読み込みが遅くなります。

ユーザーはイライラし、猛烈に F5 (ページの更新) を押し始めます。何が起こると思いますか?ユーザーのアカウントが空になる可能性がある複数の転送が発生します。


ここで、リクエストが POST (または GET 以外のもの) として行われた場合、ユーザーは最初の F5 (ページの更新) でブラウザに「それを実行してもよろしいですか?」とやさしく尋ねます。 ] ...」

于 2009-04-25T09:01:42.060 に答える
1

GET のもう 1 つの問題は、コマンドがブラウザーのアドレス バーに移動することです。したがって、ページを更新すると、「最後のものを削除する」、「注文を送信する」などのコマンドを再度発行します。

于 2009-04-24T15:02:48.473 に答える