美文网首页
Json 基础知识

Json 基础知识

作者: 步履不停的Suunny | 来源:发表于2018-05-15 14:26 被阅读0次

    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的字符,可以进行转码

    专业术语

    1. 服务端(Web开发中的):当网页或资源被请求时,在服务器上执行的一系列操作,服务器为互联网浏览器提供其处理和或加载的响应 / 。
    2. 客服端(Web开发中的);当浏览器所请求的页面加载完毕时执行的一系列操作。 通常是指 HTML、CSS和 Java Script
    3. **** :存在于json名称-值对之外的位于文档最顶层的json数组
    4. 跨站顶层json数组请求伪造(CSRF): 指利用站点对用户浏览器的信任进行的攻击。
    5. 注入攻击: 依赖于将数据注入到Web应用程序以方便恶意数据执行或编译的攻击。
    6. JSON跨站脚本攻击:通过截取或将站点中所使用的第三方代码更换为恶意脚本,来对站点进行的一种注入攻击

    相关文章

      网友评论

          本文标题:Json 基础知识

          本文链接:https://www.haomeiwen.com/subject/hynedftx.html