Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery自动完成GET&JSON数组数据安全问题_Javascript_Asp.net Mvc_Asp.net Mvc 3_Jquery - Fatal编程技术网

Javascript JQuery自动完成GET&JSON数组数据安全问题

Javascript JQuery自动完成GET&JSON数组数据安全问题,javascript,asp.net-mvc,asp.net-mvc-3,jquery,Javascript,Asp.net Mvc,Asp.net Mvc 3,Jquery,我正在通过一本MVC3书籍学习JQuery。我发现Json数据非常容易使用,但可能不安全 考虑一下这个场景,比如说,我得到了一个带有敏感客户信息的CRM。Ajax返回Json数组作为搜索结果。搜索文本框ajax autocomplete还从数据库返回敏感关键字的Json数组。等等…他们都使用GET方法 但是,据说GET方法在传递Json数组数据时存在漏洞: 你们这些JQuery专家是如何着手解决这个问题的?请帮忙 --编辑:-- @格伦。令人惊叹的非常感谢。根据你的提示,以下是我得出的结论 正常

我正在通过一本MVC3书籍学习JQuery。我发现Json数据非常容易使用,但可能不安全

考虑一下这个场景,比如说,我得到了一个带有敏感客户信息的CRM。Ajax返回Json数组作为搜索结果。搜索文本框ajax autocomplete还从数据库返回敏感关键字的Json数组。等等…他们都使用GET方法

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

你们这些JQuery专家是如何着手解决这个问题的?请帮忙

--编辑:--

@格伦。令人惊叹的非常感谢。根据你的提示,以下是我得出的结论

正常的自动完成返回json数组 还有一个mod one,其中包含一个json对象包装数组 下面是代码,假设我们在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")" />
--编辑2:--

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


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

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

编辑:

你能做的防止JOSN被读取的事情就是无限循环技巧。在调用之前粘贴一个infinte循环,这意味着您的Ajax调用必须在使用它之前去掉它。 您可以使用密钥,第三方站点将没有验证请求所需的密钥。 你可以查看推荐人。
Ajax/JSONP/JSON调用的安全性与http调用的安全性完全相同,因为Ajax请求是http请求。你处理它的方式没有任何变化。确保用户已登录并可以访问信息

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

编辑:

你能做的防止JOSN被读取的事情就是无限循环技巧。在调用之前粘贴一个infinte循环,这意味着您的Ajax调用必须在使用它之前去掉它。 您可以使用密钥,第三方站点将没有验证请求所需的密钥。 你可以查看推荐人。
另一个选项是将JSON数组包装到JSON对象中。文章和评论回答了这个问题

编辑: 从文章中:

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


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

另一个选项是在json对象中包装json数组。文章和评论回答了这个问题

编辑: 从文章中:

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


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

第一个建议是使用GET,而不是使用post。您可以使用发送某种密钥的post请求来验证它。。。顺便说一句,这些例子是对用户的攻击,而不是对服务器的攻击;用户通常是最薄弱的环节security@Tom然后使用不同的控件。用于AJAX HTTP请求的方法最终由您决定。如果一些现成的工具做不到正确的事情,那么找另一个工具或者实现你自己的工具。啊,也许你说的是JSONP,而不仅仅是JSON,对吗?JSONP的安全模型与基于ajax的解决方案完全不同。但是,当您完全在自己的安全站点内工作时,确实没有理由使用JSONP。第一个建议是使用GET,而不是使用post。您可以使用post请求发送某种密钥来验证它。。。顺便说一句,这些例子是对用户的攻击,而不是对服务器的攻击;用户通常是最薄弱的环节security@Tom然后使用不同的控件。用于AJAX HTTP请求的方法最终由您决定。如果一些现成的工具做不到正确的事情,那么找另一个工具或者实现你自己的工具。啊,也许你说的是JSONP,而不仅仅是JSON,对吗?JSONP的安全模型与基于ajax的解决方案完全不同。当您完全在自己的安全站点内工作时,确实没有理由使用JSONP
不是Ajax。我可以通过http调用获取Json数据。使用Json数据获取是我在这里讨论的内容。它是一个http调用并不重要,就像您的常规页面加载是http调用一样。这是一回事。所有这一切都是一个网络服务,同样的规则适用!以jqueryautocomplete为例,它没有像method:POST这样的选项。这只是做得到。我需要在服务器端MVC sayJsonRequestBehavior.AllowGet上打开一个漏洞,否则代码将无法工作。它只是一个Web服务,同样的规则适用!Phil Haack的博客讨论了浏览器/客户端安全问题。不是服务器。Tom,Web服务是在服务器中还是在客户机中?服务器。您仍然需要确保用户可以通过验证访问数据,确认他们是谁,并且会话可以获取信息。我可以通过http调用获取Json数据。使用Json数据获取是我在这里讨论的内容。它是一个http调用并不重要,就像您的常规页面加载是http调用一样。这是一回事。所有这一切都是一个网络服务,同样的规则适用!以jqueryautocomplete为例,它没有像method:POST这样的选项。这只是做得到。我需要在服务器端MVC sayJsonRequestBehavior.AllowGet上打开一个漏洞,否则代码将无法工作。它只是一个Web服务,同样的规则适用!Phil Haack的博客讨论了浏览器/客户端安全问题。不是服务器。Tom,Web服务是在服务器中还是在客户机中?服务器。您仍然需要确保用户可以通过验证访问数据,确认他们是谁,并且会话可以获取信息。
$(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);
            });
        }
    });
});