jQueryAjax調用和Html.antiForgeryToken()我已經在我的應用程序中實現了CSRF攻擊以下是我在網上的一些博客上看到的信息。特別是,這些職位一直是我實施的驅動因素。ASP.NETMVC的最佳實踐來自ASP.NET和Web工具開發人員內容小組一種跨站點請求偽造攻擊的剖析菲爾·哈克博客ASP.NETMVC框架中的AntiForgeryToken-Html.AntiForgeryToken和ValidateAntiForgeryToken屬性大衛·海登博客基本上,這些文章和建議說,為了防止CSRF攻擊,任何人都應該實施以下代碼:1)增加[ValidateAntiForgeryToken]對于每個接受POST http謂詞的動作[HttpPost][ValidateAntiForgeryToken]public ActionResult SomeAction( SomeModel model ) {}2)增加<%= Html.AntiForgeryToken() %>表單中向服務器提交數據的助手<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %> <input type="submit" id="btnSave" value="Save" /></div>無論如何,在我的應用程序的某些部分,我使用jQuery向服務器發布Ajax帖子,根本沒有任何形式。例如,當我允許用戶單擊圖像來執行特定操作時,就會發生這種情況。假設我有一個列有活動列表的表。表的一個列上有一個圖像,上面寫著“標記活動為已完成”,當用戶單擊該活動時,我正在進行Ajax發布,如下面的示例所示:$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});});如何使用<%= Html.AntiForgeryToken() %>在這種情況下?我應該在Ajax調用的數據參數中包含助手調用嗎?很抱歉寫了這么長的郵件,非常感謝你的幫助。編輯:按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) {
// ....
}
});});
3 回答
蕭十郎
TA貢獻1815條經驗 獲得超13個贊
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({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
success: function (response) {
// ....
}});
烙印99
TA貢獻1829條經驗 獲得超13個贊
$.post()Content-Type
$(document).ready(function () {
var securityToken = $('[name=__RequestVerificationToken]').val();
$(document).ajaxSend(function (event, request, opt) {
if (opt.hasContent && securityToken) { // handle all verbs with content
var tokenParam = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
opt.data = opt.data ? [opt.data, tokenParam].join("&") : tokenParam;
// ensure Content-Type header is present!
if (opt.contentType !== false || event.contentType) {
request.setRequestHeader( "Content-Type", opt.contentType);
}
}
});});- 3 回答
- 0 關注
- 450 瀏覽
添加回答
舉報
0/150
提交
取消
