经Python json.load处理的结果执行eval操作是否安全?
方案安全性结论
只要严格遵循标准实现流程,这个方案完全可以彻底消除eval带来的代码注入安全风险,同时能匹配你需要的解析性能要求。
核心安全逻辑
Python标准库json模块的解析、序列化逻辑严格遵循JSON规范实现,从两个层面堵死了恶意代码执行的可能:
- 第一步用
json.load加载原始文件时,所有不符合JSON语法的内容(包括JS函数调用、立即执行表达式、原型链污染payload、变量赋值语句、原生代码片段等所有可执行恶意内容)都会直接触发解析错误,根本无法进入后续流程,从源头拦截了所有非数据结构的内容。 - 第二步用
json.dumps序列化输出的字符串,是100%纯数据字面量,只会包含JSON规范支持的6类结构:数字、双引号包裹的字符串、布尔值、null、数组、键名用双引号包裹的对象,不会生成任何可执行的JS语法结构。ExtendScript端对这个字符串执行eval,本质上只是在解析纯数据字面量,不存在执行任意恶意代码的可能。
必须遵守的实现约束
只要踩了以下任意一条,就可能引入安全风险或解析错误:
- 绝对不能用Python的
str()、repr()等方法直接转换解析后的对象返回给JS,必须全程使用json.dumps()完成序列化。repr()输出的是Python对象的语法表示,和JS语法不兼容,甚至可能带入可执行片段。 - 调用
json.dumps时保持默认参数即可,不要自定义default序列化钩子处理非标准JSON类型,避免生成不符合JSON规范的输出。 - Python返回序列化后的字符串到JS侧的过程中,不要对字符串做任何拼接、替换、截断修改,避免意外引入可执行片段。
- JS侧执行
eval时建议用括号包裹字符串,避免对象字面量被JS引擎识别为代码块触发语法错误,写法参考:
// 不要直接执行eval(pythonReturnStr) var targetObj = eval('(' + pythonReturnStr + ')');
额外说明
这个方案的解析性能和你直接eval原始JSON的表现基本一致,相比纯JS实现的json2库有量级上的速度提升,完全适配你处理10MB级别大JSON文件的场景。
JSON规范的语法本身就是JS对象字面量语法的子集,标准json.dumps输出的内容和JS字面量语法完全兼容,不存在语法解析偏差。
内容的提问来源于stack exchange,提问作者Simon Björk
相关产品推荐
相关产品推荐

