猿问

jQueryAjax调用和Html.antiForgeryToken()

jQueryAjax调用和Html.antiForgeryToken()

我已经在我的应用程序中实现了CSRF攻击以下是我在网上的一些博客上看到的信息。特别是,这些职位一直是我实施的驱动因素。

基本上,这些文章和建议说,为了防止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) {
            // ....
        }
    });});


皈依舞
浏览 417回答 3
3回答

萧十郎

我使用这样一个简单的js函数AddAntiForgeryToken&nbsp;=&nbsp;function(data)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;data.__RequestVerificationToken&nbsp;=&nbsp;$('#__AjaxAntiForgeryForm&nbsp;input[name=__RequestVerificationToken]').val(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;data;};由于页面上的每个表单对于令牌都具有相同的值,所以只需将类似的内容放在最顶层的母版页中即可。<%--&nbsp;used&nbsp;for&nbsp;ajax&nbsp;in&nbsp;AddAntiForgeryToken()&nbsp;--%><form&nbsp;id="__AjaxAntiForgeryForm"&nbsp;action="#"&nbsp;method="post"><%=&nbsp;Html.AntiForgeryToken()%></form>然后在Ajax调用do(编辑以匹配您的第二个示例)$.ajax({ &nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"post", &nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;"html", &nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;$(this).attr("rel"), &nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;AddAntiForgeryToken({&nbsp;id:&nbsp;parseInt($(this).attr("title"))&nbsp;}), &nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;function&nbsp;(response)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;}});

烙印99

我喜欢360空中行走提供的解决方案,但它可能会有所改进。第一个问题是如果你$.post()对于空数据,jQuery不添加Content-Type标头,在这种情况下,ASP.NETMVC无法接收和检查令牌。所以你必须确保标题总是在那里。另一个改进是支持所有HTTP谓词有内容:POST、PUT、DELETE等。虽然您可能只在应用程序中使用POST,但是最好有一个通用的解决方案,并验证所有用动词接收的数据都有防伪造令牌。$(document).ready(function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;securityToken&nbsp;=&nbsp;$('[name=__RequestVerificationToken]').val(); &nbsp;&nbsp;&nbsp;&nbsp;$(document).ajaxSend(function&nbsp;(event,&nbsp;request,&nbsp;opt)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(opt.hasContent&nbsp;&&&nbsp;securityToken)&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;handle&nbsp;all&nbsp;verbs&nbsp;with&nbsp;content &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tokenParam&nbsp;=&nbsp;"__RequestVerificationToken="&nbsp;+&nbsp;encodeURIComponent(securityToken); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opt.data&nbsp;=&nbsp;opt.data&nbsp;?&nbsp;[opt.data,&nbsp;tokenParam].join("&")&nbsp;:&nbsp;tokenParam; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ensure&nbsp;Content-Type&nbsp;header&nbsp;is&nbsp;present! &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(opt.contentType&nbsp;!==&nbsp;false&nbsp;||&nbsp;event.contentType)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setRequestHeader(&nbsp;"Content-Type",&nbsp;opt.contentType); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;});});
随时随地看视频慕课网APP

相关分类

JQuery
我要回答