ホームページ >ウェブフロントエンド >htmlチュートリアル >[AY]ASP.NET MVC Html.AntiForgeryToken() による CSRF 攻撃の防止_html/css_WEB-ITnose
MVC の
Html.AntiForgeryToken() は、クロスサイト リクエスト フォージェリ (CSRF: クロスサイト リクエスト フォージェリ) 攻撃を防ぐために使用される対策です (XSS は CSS: Cross-Site-Script とも呼ばれます)。 ) 攻撃は異なります。XSS は通常、サイト上の信頼できるユーザーを使用して Web サイトに悪意のあるスクリプト コードを挿入して攻撃しますが、CSRF は信頼できるユーザーのふりをして Web サイトを攻撃します。
簡単な例を挙げると、たとえば、システム全体のお知らせが Web サイトのホームページに表示され、このお知らせがバックグラウンドから送信される場合、最も簡単な方法で記述します。
ホームページのお知らせを設定します。 Webサイトの背景(ホーム/インデックスページ)のコンテンツをHomeControllerのテキストアクション
に送信します@using (Html.BeginForm("Text","Home",FormMethod.Post)){ @:网站公告:<input type="text" name="Notice" id="Notice" /> <input type="submit" value="Submit" />}
HomeControllerのテキストアクション
[HttpPost] public ActionResult Text() { ViewBag.Notice = Request.Form["Notice"].ToString(); return View(); }
お知らせを記入、送信、表示
このとき、クロスサイト攻撃の脆弱性CSRF は通常、いくつかの条件に依存します
(1) 攻撃者が被害者がいるサイトを理解している
(2) 攻撃者のターゲットサイトに永続的な認証 Cookie があるか、被害者が現在のセッション Cookie を持っている
(3)現時点では、ターゲット サイトには、Web サイト上でのユーザーの行動に対する 2 番目の承認がありません
詳細については、こちらをご覧ください
http://baike.baidu.com/view/1609487.htm
ここで、アドレスがわかっていると仮定しますhttp://localhost:6060/Home/Text など、攻撃したい Web サイトの 2、3 の状況も満たします。
そこで、次の内容の新しい AntiForgeryText.html ファイルを作成しました:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head> <title></title></head><body> <form name="badform" method="post" action="http://localhost:6060/Home/Text"> <input type="hidden" name="Notice" id="Notice" value="你的网站被我黑了。。" /> <input type="submit" value="黑掉这个网站" /> </form></body></html>
この HTML に隠しフィールドが追加されました。名前と ID は、Web サイトで受け取るパラメーター名と同じです。
「この Web サイトをハックする」をクリックすると、次のように表示されます
これは、脆弱性を利用して、ホームページ上のアナウンスを変更するものです。これは、単純なクロスサイト攻撃の例です。
MVC は、ページで Html.AntiForgeryToken() を使用し、対応するアクションに [ValidateAntiForgeryToken] 機能を追加することにより、クロスサイト攻撃を防ぎます。
上記のコードを
@using (Html.BeginForm("Text","Home",FormMethod.Post)){ @Html.AntiForgeryToken() @:网站公告:<input type="text" name="Notice" id="Notice" /><input type="submit" value="Submit" />}に変更します
対応するアクション
[HttpPost][ValidateAntiForgeryToken]public ActionResult Text(){ ViewBag.Notice = Request.Form["Notice"].ToString(); return View();}
このように、AntiForgeryText.html の「この Web サイトをハックする」をクリックすると、
が表示されます。これにより、クロスサイト攻撃が防止されます。
ページ上の Html.AntiForgeryToken() は、デフォルト名 __RequestVerificationToken の Cookie を訪問者に提供します
フォームの投稿を検証するには、検証である [ValidateAntiForgeryToken] 機能をターゲット アクションに追加する必要もあります
主にチェックします
(1) リクエストに合意された AntiForgery 名を持つ Cookie が含まれているかどうか
(2) リクエストに Request.Form["Agreed AntiForgery name"]、合意された AntiForgery を持つ Cookie が含まれているかどうか名前と Request .Form の値は一致しますか?
ページ上の Html.AntiForgeryToken() は、訪問者にデフォルト名 __RequestVerificationToken の Cookie を提供します
フォームの投稿を検証するには、[ValidateAntiForgeryToken] 機能を追加する必要もあります。ターゲット アクション (検証フィルター)主にチェックします
(1) リクエストに合意された AntiForgery 名を持つ Cookie が含まれているかどうか
(2) リクエストに Request.Form["Agreed AntiForgery name" が含まれているかどうか]、合意された AntiForgery 名前 Cookie と Request.Form 値が一致するかどうか
これには主に System.Web.WebPages.dll の静的クラス AntiForgery が関係します
Html.AntiForgeryToken() は、AntiForgery 静的クラスの GetHtml メソッドを呼び出します。ランダムな値を生成し、クライアント Cookie とページの非表示フィールドにそれぞれ保存します。
(1)Request.Cookies[antiForgeryTokenName] (デフォルトも Request.Cookies["__RequestVerificationToken"])
(2)ページ上の隠しフィールド
<input name="__RequestVerificationToken" type="hidden" value="9rUlMYvsH6eMcFN9tn/wRwAG07eROraVaeTn9hHMXKkMmDbR8jLw5DKdVnZBJ9siQHeGyl1w4rSB141LnxMp2ahV0qP1lElPeukqfcUFYoxrm/EfpSJjZavykmzn15VeGFMKkmgFj5a1UFhZFaW2aZgeN38x9lt0OFSoca7eMVU=" />ここで cookie キーの名前は、ページ上の隠しフィールドの名前と同じです。ApplicationPath が指定されている場合、それは「__RequestVerificationToken」と処理された ApplicationPath。
コントローラー側は、アクションに [ValidateAntiForgeryToken] 機能を追加することで検証します。
ValidateAntiForgeryTokenAttribute は、匿名デリゲート メソッドを渡すことで、
AntiForgery クラスの Validate メソッドを呼び出します。
Validate メソッドは主に Request.Cookies[antiForgeryTokenName] と fe57356a73ef9103c6aac0941e49b1b2 の値が同じかどうかを検証します。
ページに 111a703ffd755a37c73b8bda885ebf3a2cacc6d41bbb37262a98f745aa00fbf0
在JS时要使用: $.ajaxAntiForgery才行,
如:
$.ajaxAntiForgery({ type: "post", data: { GroupName: $("#GroupName").val(), GroupPhones: $("#GroupPhones").val() }, dataType: "json", url: "/Event/Mass/AddGroup", success: function (data) { if (data) { alert("添加成功 "); $.unblockUI(); } else { alert("添加失败 "); } } })
注:对数据进行增删改时要防止csrf攻击!
(三)BeginFormAntiForgeryPost
Orchard1.6中,Module.txt文件中的设置AntiForgery:enable及页面中BeginFormAntiForgeryPost的作用也是一样的,不再赘述!
(四)参考网址
http://www.cnblogs.com/dragon_mail/archive/2011/07/10/2102364.html
http://blog.csdn.net/luck901229/article/details/8261640
本文转载地址: http://blog.csdn.net/cpytiger/article/details/8781457
AYJS.NET 排版整理
====== AYUI www.ayjs.net AY =======
推荐您阅读更多有关于“aspnetmvc,”的文章