5

我知道如何使用 MVC 的 AntiForgeryToken 属性及其关联的 HTML 帮助程序来帮助 XSRF 保护我的应用程序的表单 POST。

可以为实现 GET 的 JsonResults 做类似的事情吗?

例如,我的 View 包含一个 onSubmit jQuery 调用,如下所示:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) {
  if(data.Allow) {
    //Do something.
  }
});

我想确定这个 JsonResult 只能从预期的页面调用。

编辑:

我发现这篇关于类似问题的帖子,没有具体答案。

确保我的 GET(非破坏性)URL 仅由我自己页面的 AJAX 调用使用的最简单方法是什么?

4

4 回答 4

8

您可以将 AntiForgeryToken 与一些自定义逻辑结合使用。在服务器上创建 AntiForgery 令牌是相同的,但默认情况下,该值不包含在您的 XmlHttpRequest 中。

此令牌的值位于仅 HTTP cookie“__RequestVerificationToken”中,并且还应该以发布到服务器的表单数据中。因此,在您的 XmlHttpRequest 中包含一个键/值对并在您的控制器上使用 ValidateAntiForgeryToken - 属性

编辑:

今天我自己尝试使用 AntiForgeryToken 来处理 Ajax 请求,它工作正常。只需使用以下 javascript:

$.post('my_url',  $.getAntiForgeryTokenString(), function() { ... });

$.getAntiForgeryTokenString = function() {
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize();
};

在服务器端,您不必更改代码 - 只需为您的操作使用 ValidateAntiForgeryToken- 属性。

希望这可以帮助

于 2009-02-16T22:41:30.377 回答
1

首先为什么不使用 $.post(url, data, callback, 'json') 而不是 getJSON?正如 kleolb02 所说,您可以使用cookie 插件将 cookie 中的值添加到帖子数据中- {__RequestVerificationToken: $.cookie('__RequestVerificationToken')}

于 2009-02-16T23:48:44.820 回答
1

我在 ASP.NET MVC 项目中使用了类似的代码来使用元素的模糊功能,而没有 Ajax 表单。当某个 HTML 元素 Blur 事件发生时,此代码提供了用服务器数据填充文本字段。

希望这也有帮助。这是我的代码:

Javascript:

var mytext = { 'myText': 'example text' };
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) {
        $('#htmlElement').val(resultData);
});
AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
    return data;
};

C-Sharp 代码:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult SeoString(string myText)
    {
        try
        {
            // do something here
            return this.Json("result text");
        }
        catch (Exception)
        { return this.Json(string.Empty); }
    }
于 2012-02-10T02:03:55.347 回答
0

您可以执行与反 XSRF 方法类似的操作。只需生成一些 ID 将其插入到 javascript 中,当用户调用您的 JSON url 时,让该 url 包含生成的 ID 并检查它是否存在。

针对 XSRF 的防御也使用 sessionID 作为密钥,但这不会阻止用户从另一个网站为自己的帐户执行它。

基于会话和时间的一些哈希可能会起作用。当然,如果用户从 JS 复制值,他仍然可以从另一个位置执行它,但是您可以让该值每 x 分钟过期一次。另一种选择是使用 JS 设置一个 cookie 并在服务器端读取它。

希望这能给你一些想法,让你开始。

于 2009-02-16T22:30:25.770 回答