我正在学习使用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。真棒。谢谢。根据您的提示,这是我想出来的。
这是代码,假设我们在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的评论。他们 不是在阅读博客链接或不了解这个问题。
答案 0 :(得分:2)
Ajax / JSONP / JSON调用的安全性与http调用的安全性完全相同,因为Ajax请求是http请求。你如何处理它没有任何改变。您确保用户已登录并可以访问该信息。
如果您担心缓存数据,请使用Post或使用后端设置正确的无缓存标头。
编辑:
答案 1 :(得分:2)
另一个选项是将JSON数组包装在JSON对象中。这篇文章和评论回答了这个问题。
编辑: 来自文章:
这是一个JSON数组的事实很重要。事实证明,包含JSON数组的脚本是一个有效的JavaScript脚本,因此可以执行。仅包含JSON对象的脚本不是有效的JavaScript文件。
如果将json数组包装在对象{“myJsonArray”:[{“name”:“sensitive”},{“name”:“data”}]}中,HTML脚本标记将无法执行。