Json 基础知识,工作中用到,简单了解下
一、 json 相关概念
json 插队学习
json是什么? json是一种数据交换格式
专业术语:
JSON: JavaScript对象表示法(JavaScript Object Notation )
表示法:一个用于表示诸如数字或单词等数据的字符系统
数据交换格式:用于在不同的平台或系统间交换数据的文本, 如xml json等
可移植性: 以一种对双方系统都兼容的方式在平台间传递信息 ?
json源于JavaScript的一个子集,但是json是独立于语言的
json表达数据的方式对通用的编程概念都很友好
二、 json的语法
1、 字面量
json 是基于JavaScript字面量的 ,可以理解为从字面上读出的一些属性或值
2、 名称-值对
即 一个名称加一个值
"animal":"cat" , animal 是名词,cat是值, json使用冒号 “:”来分割名称和值,名称始终在左侧,值始终在右侧
3、正确的json语法
名称: 始终需要加双引号,注意是双引号,可以是任何有效的字符串,如下面也是合法的:
"my animal" : "cat"
"Lindsay's animial" : "cat"
但是!!为了获得最大可移植性,最好不要加空格和特殊字符。
如果多个字符,建议这样写:
"LindsaysAnimal" : "cat"
"myAnimal" : "dog"
json使用 { } 加在名称-值对的两边,使之成为一个对象, 多个名称-值对间,使用逗号分隔。
如:
{"myAnimal" : "dog", "color":"black"}
4、json语法验证
一些工具或网站:
Json Formatter & Validator
Json Edit Online (http://www.jsoneditoronine.com)
Json lint (http://jsonlint.com)
5 json 文件
以.json为后缀名
json中的数据类型
对象
数字 ( 整形 5, 浮点形 5.09, 定点形:??)
字符串
布尔型 (真或假)
数组
null
1 嵌套对象
使用嵌套对象来描述一个人:
{
"person":{
"name":"Lindsay Bassett",
"heightInInches": 66,
"head":{
"hair":{
"color": "light blond",
"length":"short",
"style": "A-line"
},
"eyes":"green"
}
}
}
错误的示例:
{
"person": "say "bob is very tall " hello hah"
}
值中,双引号又使用了双引号
修改为(加转义字符\):
{
"person": "say \"bob is very tall \" hello hah"
}
下面示例错误:
{
"dir": "c:\apache27"
}
修改为:
{
"dir": "c:\apache27"
}
需要转义的字符:
\"
\\
\/
\b (退格符)
\f 换页符)
\t (制表符)
\n (换行符)
\r (回车符)
\u (后面跟16进制字符)
如下面正确示例:
{
"dir": "\sory , saf \n sfa"
}
JSON中其他数据类型: null,数组等
{
"hairy":false,
"count":1,
"wacthColor":null, #不带手表 无颜色特征
"hands":["lefthand","righthand"]
}
三 Json schema
什么是 Schema?
当我们在描述 文字链接 的时候,需要约定数据的组织方式,比如,需要知道有哪些字段,这些字段的取值如何表示等,这就是 JSON Schema 的来源。
我们以 文字链接 为例,它对应的 JSON Schema 大概如此:
{
"type": "object",
"properties": {
"text": {
"type": "string",
"title": "文字"
},
"href": {
"type": "string",
"title": "链接地址(URL)"
}
}
}
JSON Schema 定义了如何基于 JSON 格式描述 JSON 数据结构的规范,进而提供数据校验、文档生成和接口数据交互控制等一系列能力。
它的特性和用途,可以大致归纳为以下几点:
1. 用于描述数据结构
在描述 JSON 数据时,如果数据本身的复杂度很高,高到三维四维,普通的标签函数已经无法表示这种层级结构了,而 JSON Schema 利用 object 和 array 字段类型的反复嵌套,可以规避掉这个缺陷。
当然,除了键值等基本信息,规范层面还提供了丰富的关键词支持,如果想通过自定义扩展字段,解决特定场景的业务需求,也是非常方便的。
2. 用于构建人机可读的文档
计算机领域有个概念叫做自描述。所谓自描述,可以理解为:文档本身包含了自身与其他文档交互相关的描述信息,不需要其他的配置文件或者额外信息来描述。
而 JSON Schema 就是自描述的,它本身就是一份很完善的说明文档,字段的含义说明、该如何取值、格式的要求等都清晰明了。
3. 用于生成模拟数据
通过标签函数生成模拟数据,只能解决基本的格式要求。比如 string 类型的字段,模拟出来的数据,无非是一个随机字符串。
但在 JSON Schema 中,由于字段的描述不仅仅是类型,更多的约束条件,可以确保模拟数据更接近于真实数据。
4. 用于校验数据,实现自动化测试
接口数据的校验工作,往往依赖于测试代码逻辑和用例。如果用 JSON Schema 描述一个数据接口,就不需要再编写测试代码了,所有的逻辑都可以移植到 JSON Schema 中维护。配合 jsv、tv4 等二方校验工具,接口测试可以真正自动化。
例子:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "TextLinks",
"description": "文字链接",
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"title": "文字"
},
"href": {
"type": "string",
"title": "链接地址(URL)"
}
}
},
"maxItems": 10,
"minItems": 5
}
其他信息 参考链接: https://blog.csdn.net/xiong9999/article/details/53688336
四、 JSON中的安全问题
服务端和客户端的关系: 可以理解为客户端为发生在浏览器端的一切。服务端,为发生在服务器端的一切。 包含大量的请求和响应
跨站请求伪造
跨站请求伪造,CSRF,cross-site request forgery, 读作 sea surf,是一种列用站点对用户浏览器信任而发起攻击的行为。 仅包括利用信任机制进行的攻击
利用json进行csrf攻击的例子:
json中保存敏感信息:
[
{
"user":"liliy"
},
{
"password" : "555-666-888"
}
]
此json经过校验是合法的。
但是此合法的json非常危险的,被称为顶层JSON数组,很容易被黑客攻击。
如何组织CSRF攻击?将顶层JSON数组放入到{}中,使其称为非法的JavaScript,
这样就不会被<script>标签加载。
{
"info":[
{
"user":"liliy"
},
{
"password" : "555-666-888"
}
]
}
下一步,网站应该允许post请求获取数据,禁止get获取数据
post用于提交数据,获得响应
get请求用于请求数据,得到响应
其他说法:
1、无论是get还是post,只要你的网站是对外访问的,请求总是难免的。
2、作为page中来允许其中的json调用,个人建议在page中先随机生成类似token的东东,然后放入到每个调用json的url中作为允许调用的key(设定生命周期)。
3、重复上面的话,被人恶意模拟调用终究是难免的,不过可以使用多种方式合并使用以此来提高此门槛(或直接使用session)。
注入攻击
注入攻击包含许多种形式与格式,均是利用系统本身的漏洞实现的
跨站脚本攻击
(cross-site scripting XSS), 注入攻击的一种。 javaScript中,可以使用eval()函数获取一段json字符串并对其进行编译和执行。
如果服务器发来的json代码被劫持,而注入其他恶意代码,eval()函数将会对注入的恶意代码毫无差别的进行编译和执行,访问者的浏览器中会编译和执行恶意代码
因此eval()函数的漏洞是公认的,目前使用json.parse()函数来解决这一问题,该函数仅会解析json函数,并不会执行
安全漏洞,决策上的失误
json中避免使用包含JavaScript、HTML的字符,可以进行转码
专业术语
- 服务端(Web开发中的):当网页或资源被请求时,在服务器上执行的一系列操作,服务器为互联网浏览器提供其处理和或加载的响应 / 。
- 客服端(Web开发中的);当浏览器所请求的页面加载完毕时执行的一系列操作。 通常是指 HTML、CSS和 Java Script
- **** :存在于json名称-值对之外的位于文档最顶层的json数组
- 跨站顶层json数组请求伪造(CSRF): 指利用站点对用户浏览器的信任进行的攻击。
- 注入攻击: 依赖于将数据注入到Web应用程序以方便恶意数据执行或编译的攻击。
- JSON跨站脚本攻击:通过截取或将站点中所使用的第三方代码更换为恶意脚本,来对站点进行的一种注入攻击