#2624·ajv

当输入包含具有非函数 toString 或 valueOf 属性的对象时,uniqueItems/enum/const 会发生 TypeError 问题

作者: zhangjiashuo-cs创建于 2026年5月24日更新于 2026年6月18日

说明

" 独一无二的项目 " 、 " enum " 和 " const " 等关键词(都依赖`快速-深度-平等'实现深度平等)在比较 " typeError " 或 " value of " 财产被设定为非功能值(字符串、数字、无效等)的物体时,用未处理的 " TypeError " 崩溃。 此类对象完全有效 JSON 输入 。

• 复制商(jav 8.2.0,最新消息为npm)

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? const Ajv = 需要 ("ajv"). 默认 = 需要 ("ajv") ; const ajv = 新的 Ajv ();

// 1. 独特的项目崩溃( 仅需要数据, 不需要计划配置) const uniq = ajv.compile({类型:"array",独有的项目:real }); uniq( [{}, { to string: ""}]); // TypeError: a.toString 不是一个函数

// 2. enum相撞( Schema 控制触发器) const en = ajv.compile({enum:[{},{值:0}}}); en(%%); // 类型错误: a. valueOf 不是函数


其他触发输入: QQtoString: 无效QQ, QQtoString: 0QQ, QQtoString: 假QQ, QQ值OF: 无效QQ, QQ值OF: """等.

根原因

`快速-深度-平等'(通过`runtime/equal.ts'使用)无条件称为`a.valueOf ()'/`a.toString ()'用于对象比较,而不首先检查`a.value Of `功能' ' 的类型。 当*财产* 将继承的`Object.prototype.valueof'/`toString' 隐藏在带有非功能值的上时,即发出呼叫。

影响

- 唯一项目:任何用户提供阵列上的真能:22字节的JSON有效载荷`[{},{'tstring':"]'''使验证器崩溃. 使用 ajv 验证输入数组的公共 API 端点很容易发生DoS , 除非主机应用程序将每个`validate ()' 调用`try'/`catch ' 。
- `enum' /`const' 带有攻击者控制的 schema(不太常见但真实,例如由配置驱动的 schema 引擎): 与 schema 阵列中的恶意值相同的崩溃。

坠机作为未处理的`TypeError'从预编译验证器功能中传播出来。 ajv 的正常错误收集路径被完全绕过.

失败的属性

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
fc.sert(fc.property) (英语).
fc.array(fc.dictionary(fc.string (),fc.nything ())),可以指: fc.array (fc.dictionary (fc.string (,fc.string (), fc.nything ()),可以指: f.
(arr) {(arr) {(arr) {(arr) {(arr) {(arr) {(arr) {(arr) {(arr) {
// 任何配置良好的 JSON 阵列不应崩溃唯一的项目验证
const v = ajv.compile({类型:"array",独有的项目:real });
尝试 {v( ar); 返回真;} 捕获 (e) {
(e) 类型错误的返回; /// 意外
抛出e;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
页:1
// Shrunk 失败输入 : [{}, { to String": ""]

建议改正

lib/runtime/equal.ts'中,将呼叫包成尝试/抓取,回到一个安全的参照国,** 或** 在快速-深度-平等 ' 中将其固定在上游,办法是守住呼叫:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?

  • 如果(a. value Of !=- =- =- =- 翻译:
  • 如果(a.tostring !=- object.prototype.toString)返回 a.to String()=- b.to String();
  • const aV = a.valueOf, bV = b.valueOf; + Const aV = a.
  • 如果 (aV QQ"函数"类型) { aV !================================================================================================================================================================================================
  • 如果(bV !========
  • 返回 a. v. call(a) + b. v. call(b); +}
  • const aT = a.to String, bT = b.to String; + Const aT = a.to String, bT = b.
  • 如果( aT 类型) QQ "函数" QQ . . . . . . .

内容来源: ajv-validator/ajv