JavaScript Object Notation
- 一种数据交换格式
- 跨平台
- 独立于编程语言
json基于 JS 的对象字面量表示法
字面量:
- 一眼就能知道的量
- 只能作为右值出现,由字母、数字、字符串等构成
JSON中的key总是字符串,所以要加双引号
JOSN中的value只有当类型是字符串的时候才需要加双引号,其他类型如数字、布尔值、数组、对象、null等都不应该被双引号包裹
虽然 JSON 允许 key 中存在空格,特殊符号,但这会削减他的可移植性
.json 文件是被允许的
当我们在传递数据的时候,需要提前告知对方数据是什么媒体类型(内容类型、MIME类型)。JSON 的类型为 application/json
JSON 只允许双引号包裹,不允许单引号,也不允许字符串内部有双引号,如果有必须转义。
JSON 不允许有制表符和换行符等,如果有,必须转义
JSON 中没有 undefined 只有 null
JSON 的数组中可以存储不同类型的数据,但这会削弱它的可移植性
JSON Schema
是用 JSON 作为数据交换的一种虚拟合同。可以规定:
- 值的类型
- 哪些值是需要的,哪些是可选的
- 指定值的范围
数据交换过程中,丢失是难免的,所以我们可以在 JSON 的内部声明一个 Schema,告知他们文档的预期格式。确保了数据一致性。
JSON安全
JSON作为一种数据流,存在被窃取和修改的危险。最常见的两个安全问题:
- 跨站请求伪造 <CSRF,cross-site request forgery,读作 sea-surf>
- 跨站脚本攻击 <>
跨站请求伪造
利用站点对用户浏览器信任而发起攻击的方式。
示例:如果银行这样存储你的敏感信息
[ { "user":"bob" }, { "phone":"123-12-1" }]
JSON 外面怎么没加花括号?实际上这是允许的,但我们不推荐这么做(后面解释),这么做非常危险。因为像这样的 JSON 是一个合法的 JavaScript 对象,也是可以执行的 JavaScript 脚本。
假设银行使用会话 cookie 验证,以确保信息是传送给像你一样已经注册且处于登录状态的用户
mvc
- model 即 JS 对象
- view 即 HTML
- controller 即利用 JS 交互
注入攻击
eval()绝对不要使用,应该用 parse() 代替
eval(恶意脚本)
<div onmouseover="console.log("恶意代码")"></>