为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 416 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信