亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

jQueryAjax調用和Html.antiForgeryToken()

jQueryAjax調用和Html.antiForgeryToken()

皈依舞 2019-07-26 15:15:16
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個贊

我使用這樣一個簡單的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調用do(編輯以匹配您的第二個示例)

$.ajax({
    type: "post",
    dataType: "html",
    url: $(this).attr("rel"),
    data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
    success: function (response) {
        // ....
    }});




查看完整回答
反對 回復 2019-07-27
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

我喜歡360空中行走提供的解決方案,但它可能會有所改進。

第一個問題是如果你$.post()對于空數據,jQuery不添加Content-Type標頭,在這種情況下,ASP.NETMVC無法接收和檢查令牌。所以你必須確保標題總是在那里。

另一個改進是支持所有HTTP謂詞有內容:POST、PUT、DELETE等。雖然您可能只在應用程序中使用POST,但是最好有一個通用的解決方案,并驗證所有用動詞接收的數據都有防偽造令牌。

$(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);
            }
        }
    });});



查看完整回答
反對 回復 2019-07-27
  • 3 回答
  • 0 關注
  • 450 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號