Asp.net-Mvc
jQuery Ajax 呼叫和 Html.AntiForgeryToken()
根據我在網際網路上的一些部落格文章中閱讀的資訊,我已經在我的應用程序中實現了對CSRF 攻擊的緩解。特別是這些文章是我實施的驅動力
- 來自 ASP.NET 和 Web 工具開發人員內容團隊的 ASP.NET MVC 最佳實踐
- Phil Haack 部落格的跨站點請求偽造攻擊剖析
- ASP.NET MVC 框架中的 AntiForgeryToken - David Hayden 部落格中的 Html.AntiForgeryToken 和 ValidateAntiForgeryToken 屬性
基本上這些文章和建議說,為了防止 CSRF 攻擊,任何人都應該實現以下程式碼:
- 添加
[ValidateAntiForgeryToken]接受 POST Http 動詞的每個動作[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction( SomeModel model ) { } 2.
<%= Html.AntiForgeryToken() %>在向伺服器送出數據的表單中添加助手無論如何,在我的應用程序的某些部分,我正在使用 jQuery 向伺服器發送 Ajax POST,根本沒有任何形式。例如,當我讓使用者點擊圖像以執行特定操作時,就會發生這種情況。
假設我有一張包含活動列表的表格。我在表格的一列上有一張圖片,上面寫著“將活動標記為已完成”,當使用者點擊該活動時,我正在執行 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 參數中包含輔助呼叫嗎?對不起,很長的文章,非常感謝您的幫助
編輯:
根據jayrdub的回答,我使用了以下方式
$("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 呼叫中執行(編輯以匹配您的第二個範例)
$.ajax({ type: "post", dataType: "html", url: $(this).attr("rel"), data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }), success: function (response) { // .... } });