代码之家  ›  专栏  ›  技术社区  ›  Peter J

如何保护我的jsonresult get调用?

  •  5
  • Peter J  · 技术社区  · 15 年前

    我知道如何使用MVC的AntiforgeryToken属性,以及它关联的HTML助手来帮助XSRF保护我的应用程序的表单发布。

    对于实现get的JSonResults,是否可以执行类似的操作?

    例如,我的视图包含一个onsubmit jquery调用,如下所示:

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

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

    编辑:

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

    确保我的get(非破坏性)URL只被来自我自己页面的Ajax调用使用的最简单方法是什么?

    4 回复  |  直到 13 年前
        1
  •  8
  •   ollifant    15 年前

    您可以结合一些自定义逻辑使用反组织令牌。在服务器上创建反组织令牌是相同的,但默认情况下,该值不包括在xmlhttpRequest中。

    此令牌的值位于仅HTTP的cookie“uuu requestVerificationToken”中,并且还应以发布到服务器的数据形式存在。因此,在xmlhttpRequest中包含一个键/值对,并在控制器上使用validateNatiforgeryToken-属性

    编辑:

    今天我尝试使用反组织令牌来处理Ajax请求,它运行良好。只需使用以下javascript:

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

    在服务器端,您不必更改代码-只需使用validateNatiforgeryToken-属性进行操作。

    希望这有帮助

        2
  •  1
  •   zihotki    15 年前

    首先,为什么不使用$.post(url,data,callback,'json')而不是getjson? 正如Kleolb02所说,您可以使用 cookie plugin -uuu requestverificationtoken:$cookie(''uuu requestverificationtoken')

        3
  •  1
  •   Peter O. Manuel Pinto    13 年前

    我在一个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锐代码:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public JsonResult SeoString(string myText)
        {
            try
            {
                // do something here
                return this.Json("result text");
            }
            catch (Exception)
            { return this.Json(string.Empty); }
        }
    
        4
  •  0
  •   TomHastjarjanto    15 年前

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

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

    一些基于会话和时间的散列可以实现这个技巧。当然,如果用户从JS复制值,他仍然可以从另一个位置执行该值,但是您可以让该值每X分钟过期一次。另一个选项是用JS设置一个cookie并在服务器端读取它。

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