如何保护我的JsonResult GET调用?

时间:2009-02-16 21:34:39

标签: jquery asp.net-mvc csrf

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

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

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

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

我想确定这个JsonResult只能从目标页面调用。

编辑:

我发现了this post关于类似问题,没有具体答案。

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

4 个答案:

答案 0 :(得分: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-属性即可。

希望这有帮助

答案 1 :(得分:1)

首先,为什么不使用$ .post(url,data,callback,'json')而不是getJSON? 正如kleolb02所说,您可以使用cookie plugin - {__ RequestVerificationToken:$ .cookie('__ RequestVerificationToken')}

将Cookie中的值添加到帖子数据中

答案 2 :(得分:1)

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

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

使用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); }
    }

答案 3 :(得分:0)

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

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

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

希望这能为您提供一些让您入门的建议。