2009-04-01 6 views
1

ASP.NET MVCでは、モデルを変更するコントローラへの呼び出しにGET要求を使用しないことが一般的なようです。たとえば、単純なHTMLリンクをクリックして顧客を削除することはできません。ASP.NET MVC:プライベートWebページのGET要求は非破壊でなければならないのですか?

私が知っているこのルールの唯一の理由は、データベースを劇的に変更する可能性のあるWebクローラーに対して保護されていないということです。 GET要求は一般的に安全とみなされますが、POST要求は安全ではありません。

このルールは、ウェブサイトの非公開部分(例:パスワードで保護されたユーザー管理エリア)には適用されませんか?または、破壊的なGETリクエストを使用しない他の理由がありますか?

答えて

1

これは一般にHTTPの一部です。 the HTTP 1.1 RFC 2616

から実装者は ソフトウェアがインターネット上で自分の の相互作用でユーザーを表し、 が に、ユーザは、彼らが 有していてもよいかかる場合があります任意のアクションを認識することが可能に注意しなければならないことを認識すべきです予想外の が自分自身や他の人にとって重要です。特に

、大会は はGETとHEAD 方法は検索以外 他のアクションをとるの 意義を持つべきではないことが確立されてきました。これらの方法は に「安全」と考えるべきです。これにより、 エージェントは 特別な方法で POST、PUT、DELETEなどの他のメソッドを表すことができます。 はおそらく 安全でないアクションが要求されていることをユーザに認識させます。

当然、 がGET要求を実行した結果、サーバが に副作用を生成しないようにすることはできません。実際には、 いくつかの動的リソースは、 機能を考慮します。ここで重要な区別は です。ユーザーは に副作用を要求していないため、 に責任を負うことはできません。

言い換えれば、それは強制されませんが、GETリクエストが副作用を持つのは本当に悪いフォームです。たとえば、ユーザーが何かを更新するURLをブックマークしているとしたら、おそらくそれが起こるとは思わないでしょう。

+0

良い点、私はブックマークについて考えなかった。 –

0

はい。

ウェブクローラーだけではなく、CRSF - Cross Site Request Forgeryについてです。

だから、誰かがあなたのウェブサイトにログインし、hax0rs.comのソースで

をwww.hax0rs.comを閲覧されていることを想像して、ユーザーがログインしているため、以下のタグ

<img src="http://mysite.com/members/statusChange?status=I%20am%20looking%20for%20a%20gimp%20mask" height="0" width="0"> 

ですリクエストがサイトに送信されるため、認証Cookieも一緒に送信されます。突然、あなたのユーザーの状態が変わった。

楽しい:

+0

しかし、彼はポストリクエストでも同じことをすることができます。例えば、彼は無害な見た目の誤ったボタンをクリックさせることができます。 POST要求があれば、実際にはセキュリティは向上しません。 –

+0

これはPOSTでも可能です。クリックしなくてもフォームを提出するジャバスクリプト。 –

+0

しかし、フォームをトークンやカナリアで保護する方が簡単です。 URLへのアクセスは醜いし、ブックマークを中断します。 – blowdart

1

もう1つの理由は、ブラウザ用のアクセラレータプラグインです。これらは、現在のページ上のリンクをプリフェッチすることによってページの読み込みを高速化しようとします。リスト内のすべてのオブジェクトを削除するGETリクエストがたくさんある場合、プラグインはそれらを削除するとします。

これは、プレーンな古いハイパーリンクのように見えたら、ブラウザーがGETリクエストで何をするのか予測できないことです。

0

でも、GETリクエストで何らかの "非検索"アクションを実行できるとします。例えば、「LastVisit」レコードを更新することは、破壊的ではなく、比較的安全と考えることができる。

関連する問題