ValidateAntiForgeryTokenの目的、説明、例


310

ValidateAntiForgeryTokenの目的を説明しValidateAntiForgeryToken、MVC 4での例を示していただけませんか?

この属性を説明する例は見つかりませんでしたか?


8
この投稿を確認してください。prideparrot.com/blog
archive

1
ちなみに、なぜMSが.BeginFormヘルパー内にこれを正しく配置できなかったのか、私には本当にわかりません。したがって、これはRailsのように自動的に存在します
jazzcat

回答:


350

MVCの偽造防止サポートにより、一意の値がHTTP専用のCookieに書き込まれ、同じ値がフォームに書き込まれます。ページが送信されるときに、Cookieの値がフォームの値と一致しない場合はエラーが発生します。

この機能により、クロスサイトリクエストフォージェリが防止されることに注意してください。つまり、認証されたユーザーの資格情報を使用して非表示のコンテンツを送信しようとして自分のサイトに投稿する別のサイトのフォームです。攻撃には、ログインしているユーザーをだましてフォームを送信させるか、ページが読み込まれたときにプログラムでフォームをトリガーするだけです。

この機能は、他の種類のデータ偽造や改ざんベースの攻撃を防止しません。

これを使用するには、アクションメソッドまたはコントローラーをValidateAntiForgeryToken属性で装飾@Html.AntiForgeryToken()し、フォームにメソッドへの呼び出しを呼び出します。


5
@クリスそれは両方です。私の回答のとおり、「一意の値をHTTP専用のCookieに書き込み、同じ値がフォームに書き込まれます
Richard Szalay

21
これがデフォルトで設定されていないのはなぜですか?
Christian Hagelid 2013年

12
Ruby on Railsではないため、@ Christian。;-)
Martin Capodici 2014年

6
フォーム__RequestVerificationTokenとCookie __RequestVerificationTokenは同じではなく、ペアとして機能しているようです。
WaiKit Kung、2015

5
@rdans CORSとCSRFはまったく異なります。CORSは、他のドメインがサーバー上のAPIにアクセスできるようにするためのものであり、CSRFは、フォームの投稿が期待どおりのページからのものであることを確認するためのものです。
Richard Szalay 2017年

52

ValidateAntiForgeryToken属性の基本的な目的は、クロスサイトリクエストフォージェリ攻撃を防ぐことです。

クロスサイトリクエストフォージェリは、信頼できるユーザーのブラウザから有害なスクリプト要素、悪意のあるコマンド、またはコードが送信される攻撃です。この詳細については、http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pagesをご覧 ください

使い方は簡単ですが、ValidateAntiForgeryToken属性でメソッドを装飾する必要があります。

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

System.Web.Mvc名前空間から派生しています。

そして、ビューでこのコードを追加してトークンを追加し、送信時にフォームの検証に使用されるようにします。

@Html.AntiForgeryToken()

はい、そうです。フォームから@ Html.AntiForgeryToken()を呼び出し、ValidateAntiForgeryTokenAttributeを保護するアクションメソッドに追加する必要があります。
Chandra Malla 2015年

このわかりやすい回答に感謝します:)
noobprogrammer

4

ASP.Net Coreでは、偽造防止トークンがフォームに自動的に追加されるため、@Html.AntiForgeryToken()かみそりフォーム要素を使用する場合、またはIHtmlHelper.BeginFormを使用する場合、およびフォームのメソッドがGETでない場合は、追加する必要はありません。

次のようなフォームの入力要素が生成されます。 <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

また、ユーザーがフォームを送信すると、検証が有効になっている場合、このトークンはサーバー側で検証されます。

[ValidateAntiForgeryToken]属性はアクションに対して使用できます。このフィルタが適用されているアクションに対して行われたリクエストは、リクエストに有効な偽造防止トークンが含まれていない限りブロックされます。

[AutoValidateAntiforgeryToken]属性はコントローラーに対して使用できます。この属性は、ValidateAntiForgeryToken属性と同じように機能しますが、次のHTTPメソッドを使用して行われたリクエストにトークンを必要としない点が異なります。 GET HEAD OPTIONS TRACE

追加情報:https : //docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

マイクロソフトは、セキュリティの目的でアプリケーションで使用する組み込み機能を提供しているため、サイトをハッキングしたり、重要な情報に侵入したりすることはできません。

Harpreet SinghによるMVCアプリケーションのValidateAntiForgeryTokenの目的から

ValidateAntiForgeryTokenの使用

この概念を理解するために簡単な例を試してみましょう。あまり複雑にしたくないので、Visual Studioで既に利用可能なMVCアプリケーションのテンプレートを使用します。これを段階的に行います。はじめましょう。

  1. ステップ1-デフォルトのインターネットテンプレートを使用して2つのMVCアプリケーションを作成し、それらの名前をそれぞれCrossSite_RequestForgeryおよびAttack_Applicationとして指定します。

  2. 次に、CrossSite_RequestForgeryアプリケーションのWeb Configを開き、接続文字列を以下の文字列に変更して保存します。

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. 次に、[ツール] >> [NuGetパッケージマネージャー]、[パッケージマネージャーコンソール]の順にクリックします

  2. 次に、パッケージマネージャーコンソールで以下の3つのコマンドを実行して、データベースを作成します。

Enable-Migrations add-migration first update-database

重要な注意-開発者の作業方法でこの例を作成したいので、コードファーストアプローチでデータベースを作成しました。データベースを手動で作成することもできます。それはあなたの選択です。

  1. 次に、アカウントコントローラーを開きます。ここでは、タイプがpostであるregisterメソッドが表示されます。このメソッドの上には、[ValidateAntiForgeryToken]として利用可能な属性があるはずです。この属性にコメントを付けます。次に、registerを右クリックして、Viewをクリックします。ここでも、HTMLヘルパーが@ Html.AntiForgeryToken()として見つかります。これもコメント。アプリケーションを実行し、登録ボタンをクリックします。URLは次のように開かれます。

http:// localhost:52269 / Account / Register

-読者の皆さんの頭に浮かぶ質問は、これらの2つのヘルパーにコメントが必要な理由です。これらは、リクエストの検証に使用されることを知っているからです。次に、これらのヘルパーを適用する前後の違いを示したいからです。

  1. 次に、2番目のアプリケーションであるAttack_Applicationを開きます。次に、アカウントコントローラーのRegisterメソッドを開きます。以下に示すように、POSTメソッドを単純なメソッドに変更するだけです。

    登録用紙
    1. @ Html.LabelFor(m => m.UserName)@ Html.TextBoxFor(m => m.UserName)
    2. @ Html.LabelFor(m => m.Password)@ Html.PasswordFor(m => m.Password)
    3. @ Html.LabelFor(m => m.ConfirmPassword)@ Html.PasswordFor(m => m.ConfirmPassword)

7.ここで、あなたがハッカーで、CrossSite_RequestForgeryアプリケーションにユーザーを登録できるURLを知っているとします。これで、ForgeryサイトをAttacker_Applicationとして作成し、同じURLをpostメソッドに配置しました。

8.このアプリケーションを実行し、登録フィールドに入力して、登録をクリックします。CrossSite_RequestForgeryアプリケーションに登録されていることがわかります。CrossSite_RequestForgeryアプリケーションのデータベースを確認すると、入力したエントリが表示されます。

  1. 重要-次に、CrossSite_RequestForgeryアプリケーションを開き、アカウントコントローラーでトークンをコメント化して、ビューを登録します。同じプロセスでもう一度登録してみてください。すると、以下のようなエラーが発生します。

「/」アプリケーションでのサーバーエラー。________________________________________必要な偽造防止Cookie「__ RequestVerificationToken」が存在しません。

これはコンセプトが言うことです。ビューに追加するもの、つまり@ Html.AntiForgeryToken()は、ロード時に__RequestVerificationTokenを生成し、[ValidateAntiForgeryToken]をコントローラーメソッドで使用できるようにします。このトークンをポストタイムに一致させます。トークンが同じ場合、これは有効なリクエストであることを意味します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.