繁体   English   中英

JQuery自动完成GET和JSON数组安全问题

[英]JQuery Autocomplete GET & JSON array data security concerns

我正在学习带有MVC3书籍的JQuery。 我发现Json数据非常易于使用,但可能不安全。

考虑一下这种情况,比方说,我得到了一个具有敏感客户信息的CRM。 Ajax将Json数组作为搜索结果返回。 搜索文本框ajax autocomplete还从数据库返回敏感关键字的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专家解决这个问题? 请帮忙。

---编辑:---

@Gren。 真棒。 谢谢。 根据您的提示,这是我想出来的。

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

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

    // 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的评论。 他们没有阅读博客链接或不了解问题。

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

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

编辑:

  • 你可以采取的措施来阻止JOSN被读取是无限循环技巧。 在调用前粘贴一个infinte循环,意味着你的Ajax调用必须在使用前删除它。
  • 您可以使用密钥,第三方站点将没有验证请求所需的密钥。
  • 你可以查看推荐人。

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

编辑:从文章:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM