知识卡片

数据不是代码

普通读书笔记卡 · 1501.b

内容

JSON 语法源自 JavaScript 对象字面量,但本身只是数据格式、语言无关,解析不需要执行代码——json_parse 是纯粹的递归降序解析器,逐字符读取构造数据结构,全程不调用引擎运行文本。这与 eval 把 JSON 当代码执行本质不同:前者只读数据,后者会连同夹带代码一起执行。发散:数据和代码分开是安全边界的基础,数据格式一旦允许携带可执行逻辑,解析就成了攻击入口。

参考来源

- 位置:《JavaScript语言精粹(修订版)》附录E《JSON》"一个JSON解析器"一节及开篇 - 结论依据:原文开篇说明 JSON "基于JavaScript的对象字面量表示法……尽管只是JavaScript的一个子集,但它与语言无关",随后给出的 json_parse 实现是一个逐字符扫描字符类型(字符串/数字/word/array/object)的递归降序解析器,全程只做字符匹配和数据结构构造,不涉及代码执行,据此推出 JSON 本质是数据格式、解析不等于执行代码的结论。 - 原始内容:JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式。它基于JavaScript的对象字面量表示法……这是一个能把JSON文本解析成JavaScript数据结构的函数。它是一个简单的递归降序解析器。