JSON

本文介绍了JSON的基本概念、语法和数据类型,并讨论了JSON Schema的重要性。还涉及到了跨站请求伪造、注入攻击的安全问题,强调了JSON-P和CORS在跨域资源共享中的角色。此外,提到了JavaScript中的XMLHttpRequest和WebAPI在异步操作中的应用。

JSON

通过阅读《JSON必知必会》一书,大致梳理一下JSON的概念、语法、用法以及注意事项:

  • 什么是JSON
  • JSON语法
  • JSON数据类型

什么是JSON

JSON:(JavaScript Object Notation)是一种数据交换格式
JSON基于JavaScript对象字面量,但它具有语言无关性。作为一种数据交换格式,可移植性良好。

JSON语法

JSON的数据交换能力是通过名称-值对实现的。名称位于冒号的左侧,使用双引号括起来;值位于冒号的右侧,可以是字符串、数字、null、布尔值、数组以及对象等数据类型。
注意:虽然在名称中可以使用空格、引号之类的字符,但不建议这样使用,因为考虑到可移植性的因素,这类字符破坏了各式系统间的可移植性。这类字符包括除a~z、0~9外的其他字符。
花括号{}加在名称-值对的两边来使之成为一个对象。
名称-值对之间使用逗号隔开。
方括号[]包住数组。

JSON数据类型

包括:对象、字符串、数字、布尔值、null、数组

JSON Schema(模式)

对json数据进行一定的限制,以符合对数据格式及数据类型的要求。
相关规范可查看:
JSON Schema主页(http://json-schema.org/
JSON Schema验证规范(http://json-schema.org/lastest/json-schema-validation.html

跨站请求伪造

利用信任机制进行的攻击。
顶层json数组是合法的json结构,但类似的合法的json是十分危险的,因为他们也是可以执行的JavaScript脚本。
网站通过<script />标签来引用其他站点的源,黑客则可以利用这一特点获得用户信息,造成跨站请求伪造攻击。
应避免使用顶层json数组进行敏感信息的存储和传播,这样容易被不法黑客截获到用户的隐私信息,造成损失。
尽量使用POST请求获取数据,避免使用GET请求。GET用于请求数据,得到响应。POST用于提交数据,得到响应。如果服务端允许GET请求,就可以直接通过浏览器或<script>标签链接到它,但POST请求不能直接被链接到,一旦不能使用<script>标签,黑客就会受到资源共享机制的限制。
对于GET还是POST请求,影视具体情况而定。如果页面不需要通过URL或<script>标签来加载,那么应尽量避免使用GET请求。

注入攻击

向网站注入恶意代码实现的攻击。
跨站脚本攻击(注入攻击的一种形式):在使用JSON时常见的安全漏洞通常发生在JavaScript从服务器上获取一段JSON字符串并将其转换为JavaScript对象时。
对于JSON这种文本数据,需要将其转换成对象存入内存,才能进一步的使用,JavaScript的eval()函数可以实现这一任务,它获取一段字符串,并对其进行编译和执行。但是eval()函数对于字符串的处理是无差别的编译执行,如果从你无权控制的第三方服务器端请求的JSON被人劫持并替换成恶意代码,那么用户就会受到代码注入攻击。
解决这一问题的方式是使用JSON.parse()函数代替eval()。JSON.parse()只会解析json,并不执行脚本。这样如果请求的JSON数据被替换成恶意js代码,也不会被执行。
如:
var jsonString = "alert('这是被劫持后的JavaScript恶意代码')";
var myObject = eval("("+jsonString+")");
alert(myObject.animal);

以上代码执行的结果会是eval函数执行的结果,即打印出“这是被劫持后的JavaScript恶意代码”的结果。
var jsonString = "alert('这是被劫持后的JavaScript恶意代码')";
var myObject = JSON.parse("("+jsonString+")");
alert(myObject.animal);

以上代码只会解析jsonString,而不会执行它,故当执行alert时,并不能执行正确结果,也就防止的注入代码的肆意执行破坏。
允许在JSON中使用HTML以及直接将值插入页面的行为都是幼稚的。
将包含在JSON中的html代码标签进行转码,使之成为不合法的HTML代码可以防止代码注入页面,执行一些未知程序。

JavaScript中的XMHttpRequest和WebAPI简介

XMHttpRequest和WebAPI仅是一种简单的客户端与服务端的关系。XMHttpRequest负责在客户端发起请求,WebAPI负责在服务端返回响应。

WebAPI

简单的理解可以类比于ArcGIS API、BaiduMap API、PayPal API等由提供服务的企业向数据请求时提供数据服务。
例如在请求ArcGIS地图服务数据时:
var map=new Map("mapDiv",{center:[-56.049,38.485],zoom:3,basemap:"streets"});
中的{center:[-56.049,38.485],zoom:3,basemap:"streets"}就是使用json格式向WebAPI进行数据请求操作。

异步操作

异步操作通常是指那些发生在幕后的、不会中断主进程的操作。
在JavaScript的异步操作(AJAX)中,“主进程”指Web浏览器的显示进程。
这里有一个很直观的例子:
一个新闻页面中包含一个显示天气的侧边栏。在阅读新闻时,后台代码会每隔60秒异步更新显示的天气数据。而这一操作并不需要刷新页面,也不会再阅读文章时对页面滚动产生什么影响。页面中唯一发生变化的只是包含天气信息的侧边栏。
使用XMLHttpRequest进行一步请求xml,但不要被它的名字所迷惑,其实它也可以请求json数据。
在请求json数据时,可能会涉及到两个专业名词:序列化反序列化
序列化:是将对象转换成文本的过程。
反序列化:是将文本转换成对象的过程。
反序列化示例:var myObject = JSON.parse(myXMLHttpRequest.reponseText);将reponseText文本解析成myObject对象。
序列化示例:var myJSON = JSON.stringify(myObject);将反序列化的myObject进行序列化

跨域资源共享

浏览器的实现是建立在同源策略这一安全功能的基础上的,违反同源策略的数据请求是不会得到正确的响应来获得想要的信息的。
但通过WebAPI进行数据请求时,好像并没有受到同源策略的影响,能够轻松的获取想要的数据。其实这并没用违反同源策略,只是提供服务的API开发者在他们的服务器上实现了跨域资源共享(CORS),这些服务器会在响应头额外加上一些带有Access-Control——Allow前缀的属性。
例如:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:GET,POST
Access-Control-Allow-Origin:*

这些头部定义了证书是否可用,哪些HTTP方法(GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT)是可用的,以及允许哪些域名(这里允许任意域名)。
通过跨域资源共享机制可以阻止黑客通过跨站请求伪造攻击,只要设置允许的HTTP访问方法,以及可以访问该API的域名即可做到。

JSON-P

功能类似于CORS,但并非公认标准一种资源共享机制。常用在两个站点之间没有标准的API,但也需要进行json资源共享。
JSON-P指带有padding(内联)0的JSON。因为<script>标签不受同源策略的影响,JSON-P就是利用这一点向不同域名的站点请求JSON。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值