第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

jQueryAjax調(diào)用和Html.antiForgeryToken()

jQueryAjax調(diào)用和Html.antiForgeryToken()

皈依舞 2019-07-26 15:15:16
jQueryAjax調(diào)用和Html.antiForgeryToken()我已經(jīng)在我的應(yīng)用程序中實現(xiàn)了CSRF攻擊以下是我在網(wǎng)上的一些博客上看到的信息。特別是,這些職位一直是我實施的驅(qū)動因素。ASP.NETMVC的最佳實踐來自ASP.NET和Web工具開發(fā)人員內(nèi)容小組一種跨站點請求偽造攻擊的剖析菲爾·哈克博客ASP.NETMVC框架中的AntiForgeryToken-Html.AntiForgeryToken和ValidateAntiForgeryToken屬性大衛(wèi)·海登博客基本上,這些文章和建議說,為了防止CSRF攻擊,任何人都應(yīng)該實施以下代碼:1)增加[ValidateAntiForgeryToken]對于每個接受POST http謂詞的動作[HttpPost][ValidateAntiForgeryToken]public ActionResult SomeAction( SomeModel model ) {}2)增加<%= Html.AntiForgeryToken() %>表單中向服務(wù)器提交數(shù)據(jù)的助手<div style="text-align:right; padding: 8px;">     <%= Html.AntiForgeryToken() %>    <input type="submit" id="btnSave" value="Save" /></div>無論如何,在我的應(yīng)用程序的某些部分,我使用jQuery向服務(wù)器發(fā)布Ajax帖子,根本沒有任何形式。例如,當(dāng)我允許用戶單擊圖像來執(zhí)行特定操作時,就會發(fā)生這種情況。假設(shè)我有一個列有活動列表的表。表的一個列上有一個圖像,上面寫著“標(biāo)記活動為已完成”,當(dāng)用戶單擊該活動時,我正在進(jìn)行Ajax發(fā)布,如下面的示例所示:$("a.markAsDone").click(function (event) {     event.preventDefault();     $.ajax({         type: "post",         dataType: "html",         url: $(this).attr("rel"),         data: {},         success: function (response) {             // ....         }     });});如何使用<%= Html.AntiForgeryToken() %>在這種情況下?我應(yīng)該在Ajax調(diào)用的數(shù)據(jù)參數(shù)中包含助手調(diào)用嗎?很抱歉寫了這么長的郵件,非常感謝你的幫助。編輯:按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貢獻(xiàn)1815條經(jīng)驗 獲得超13個贊

我使用這樣一個簡單的js函數(shù)

AddAntiForgeryToken = function(data) {
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
    return data;};

由于頁面上的每個表單對于令牌都具有相同的值,所以只需將類似的內(nèi)容放在最頂層的母版頁中即可。

<%-- used for ajax in AddAntiForgeryToken() --%><form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>

然后在Ajax調(diào)用do(編輯以匹配您的第二個示例)

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




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

TA貢獻(xiàn)1829條經(jīng)驗 獲得超13個贊

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

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

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

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



查看完整回答
反對 回復(fù) 2019-07-27
  • 3 回答
  • 0 關(guān)注
  • 440 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號