1

我正在用 MVC3 书学习 JQuery。我发现Json数据确实好用,但可能不安全。

考虑一下这种情况,比如说,我有一个带有敏感客户信息的 CRM。Ajax 返回 Json 数组作为搜索结果。搜索文本框 ajax 自动完成功能还从数据库返回敏感关键字的 Json 数组。等等......他们都使用GET方法。

但是,据说 GET 方法在传递 Json 数组数据时存在漏洞:

http://haacked.com/archive/2009/06/25/json-hijacking.aspx

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

你们那里的 JQuery 专家如何解决这个问题?请帮忙。

- - 编辑: - -

@格伦。惊人的。谢谢你。根据您的提示,这就是我想出的。

  1. 正常的自动完成返回 json 数组
  2. 和一个带有包裹数组的 json 对象的 mod

这是代码,假设我们在 controller.cs 中有一个名为 txtlst 的全局列表...

    // normal one
    public JsonResult AutoCompleteHelper1(string term) {
        //if (!Request.IsAjaxRequest()) return null;
        var lst = txtlst.Where(s => s.StartsWith(term)).ToList();
        var res = lst.Select(x => new { value = x }).ToList();
        return Json(res, JsonRequestBehavior.AllowGet);
    }
    //mod one
    public JsonResult AutoCompleteHelper2(string term) {
        //if (!Request.IsAjaxRequest()) return null;
        var lst = txtlst.Where(s => s.StartsWith(term)).ToList();
        var res = lst.Select(x => new { value = x }).ToList();
        return Json(new { wrapper= res, name="wrapper" }, JsonRequestBehavior.AllowGet);
    }
}

然后在 .cshtml 文件中...

<p>Auto Complete Example</p>
<input type="text" name="q" id="MyInput1" data-autocomplete-source="@Url.Action("AutoCompleteHelper1", "Home")"/>
<input type="text" name="q" id="MyInput2" data-autocomplete-source="@Url.Action("AutoCompleteHelper2", "Home")" />

然后在 .js 文件中...

$(document).ready(function () {

    // normal autocomplete
    $("#MyInput1").autocomplete({ source: $("#MyInput1").attr("data-autocomplete-source") });

    // mod autocomplete with a wrap
    $("#MyInput2").autocomplete({
        source: function (req, add) {
            $.getJSON($("#MyInput2").attr("data-autocomplete-source"), req, function (data) {
                var suggestions = [];
                $.each(data.wrapper, function (i, o) {
                    suggestions.push(o.value);
                });
                add(suggestions);
            });
        }
    });
});

--- 编辑 2: ---

请忽略那些告诉我使用 POST 的评论。他们没有阅读博客链接或不理解问题。

4

2 回答 2

2

Ajax/JSONP/JSON 调用的安全性与 http 调用的安全性完全相同,因为 Ajax 请求是 http 请求。你处理它的方式没有任何改变。您确保用户已登录并且可以访问信息。

如果您担心数据被缓存,请使用 Post 或在后端设置适当的无缓存标头。

编辑:

  • 你可以做的事情是防止 JOSN 被读取是无限循环技巧。在调用前添加一个无限循环,这意味着您的 Ajax 调用必须在使用它之前去掉它。
  • 您可以使用密钥,第三方站点将没有验证请求所需的密钥。
  • 您可以查看推荐人。
于 2012-04-24T14:28:13.433 回答
2

另一种选择是将 JSON 数组包装在 JSON 对象中。里面的文章和评论回答了这个问题。

编辑:来自文章:

这是一个 JSON 数组这一事实很重要。事实证明,包含 JSON 数组的脚本是有效的 JavaScript 脚本,因此可以执行。仅包含 JSON 对象的脚本不是有效的 JavaScript 文件。

如果将 json 数组包装在对象 {"myJsonArray":[{"name":"sensitive"},{"name":"data"}]} 中,则 HTML 脚本标签将无法执行。

于 2012-04-24T15:09:33.813 回答