[解決済み】jQuery Ajaxの呼び出しとHtml.AntiForgeryToken()について)
質問
私のアプリでは、以下のような緩和策を実装しています。 CSRF攻撃 インターネット上のいくつかのブログ記事で読んだ情報に従って。特に、これらの投稿は私の実装の原動力となりました。
- ASP.NET MVCのベストプラクティス ASP.NETおよびWebツール開発者向けコンテンツチームより
- クロスサイトリクエストフォージェリ攻撃の解剖学 Phil Haackブログより
- ASP.NET MVC フレームワークの AntiForgeryToken - Html.AntiForgeryToken 属性と ValidateAntiForgeryToken 属性 David Haydenブログより
基本的に、これらの記事や勧告は、CSRF攻撃を防ぐために、誰もが以下のコードを実装する必要があると述べています。
-
を追加します。
[ValidateAntiForgeryToken]
POST Http 動詞を受け入れるすべてのアクションに適用されます。[HttpPost] [ValidateAntiForgeryToken] を使用します。 public ActionResult SomeAction( SomeModel model ) {... }
-
を追加します。
<%= Html.AntiForgeryToken() %>
サーバーにデータを送信するフォームの中にあるヘルパーです。
とにかく、私のアプリの一部では、フォームをまったく持たずにjQueryでサーバーにAjax POSTしています。これは、例えば、ユーザーが画像をクリックして特定のアクションを実行するような場合に起こります。
例えば、アクティビティーのリストを持つテーブルがあるとします。テーブルのカラムに「"Mark activity as completed"」という画像があり、ユーザーがそのアクティビティをクリックすると、次のサンプルのようにAjax POSTが実行されます。
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
を使用するにはどうすればよいですか?
<%= Html.AntiForgeryToken() %>
のような場合でしょうか?Ajax呼び出しのdataパラメータ内にヘルパー呼び出しを含めるべきですか?
長文で申し訳ありません。
EDIT :
の通りです。 ジェイダブ 回答 私は次のように使っています。
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {
AddAntiForgeryToken({}),
id: parseInt($(this).attr("title"))
},
success: function (response) {
// ....
}
});
});
解決方法は?
私は以下のような簡単なjs関数を使っています。
AddAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
トークンはページ上のすべてのフォームに同じ値が設定されるので、最上位のマスターページに次のような記述をするだけです。
<%-- used for ajax in AddAntiForgeryToken() --%>
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>
次に、ajaxコールで次のようにします (2番目の例と一致するように編集)。
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
success: function (response) {
// ....
}
});
関連
-
[解決済み] Kendo UI MVC用パスワードテキストボックス
-
[解決済み] jQueryを使ったAjaxリクエストの中断
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
-
[解決済み] jQuery AJAX送信フォーム
-
[解決済み] jQuery Ajax ファイルアップロード
-
[解決済み] 既存のASP.NET MVC 4 WebアプリケーションのプロジェクトにWeb APIを追加するにはどうすればよいですか?
-
[解決済み】ASP.NET mvcとIISでURLのドットが原因で404になる
-
[解決済み] ASP.NET MVCのAjaxポストでantiforgerytokenを含める。
-
[解決済み] Visual Studio 2012 または Visual Studio 2013 で古い MVC プロジェクトを開くにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Razor View Engine : 式ツリーには、動的な操作を含めることができません。
-
[解決済み] MVC 3 - 辞書に渡されたモデル項目の型は 'System.Collections.Generic.List`1 です。
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み] MVCにおけるViewModelとは?
-
[解決済み] ASP.NET MVC ビューエンジンの比較
-
[解決済み】Html.ActionLinkが"?Length=4 "とレンダリングされるのはなぜか?
-
[解決済み】TextBoxFor()からは日付のみ。)
-
[解決済み] ASP.NET MVCのAjaxポストでantiforgerytokenを含める。
-
[解決済み] MVCのHTMLヘルパーで生成されたHTML要素にclass属性を追加するにはどうすればよいですか?
-
[解決済み] ソートロジックは、モデル、ビュー、コントローラのいずれに配置するのがよいのでしょうか?[クローズド]