JS API测试:无校验遍历含getter的用户对象是否会引发异常
验证含Getter的用户对象对无校验遍历方法的破坏作用
兄弟,你找对方向了——这种无校验就盲目遍历用户传入对象的写法,确实藏着不少坑,尤其是碰到带自定义getter的对象时,分分钟就能搞崩逻辑或者泄露数据。我给你整理几个实打实的验证案例,能直接证明这个问题:
1. 触发意外副作用甚至直接崩溃
先看开发写的这个基础遍历逻辑:
function funcWeGiveToUser(objFromUsers) { for (const key in objFromUsers) { console.log(`Key: ${key}, Value: ${objFromUsers[key]}`); // 这里可能还有其他业务逻辑 } }
如果用户传入一个带“搞事情”getter的对象,比如:
const troubleObj = { get triggerCrash() { console.log("⚠️ 我被触发了!"); // **直接抛出异常中断整个遍历流程** throw new Error("遍历被迫终止,程序挂了"); }, normalProp: "我是正常属性" }; funcWeGiveToUser(troubleObj);
运行这段代码你会发现,遍历到triggerCrash时,getter自动执行,不仅打印了敏感信息,还直接抛出异常,让整个funcWeGiveToUser方法崩溃,后续的业务逻辑完全没法执行。
2. 轻松绕过私有数据保护
你提到已经在尝试访问私有数据,这里给你补个更直观的例子:
class User { #privatePassword = "mySuperSecret123"; // 类私有字段,本来是不可直接访问的 get leakPassword() { return this.#privatePassword; // getter直接返回私有数据 } } const userObj = new User(); funcWeGiveToUser(userObj);
正常情况下,#privatePassword是外部无法直接访问的,但无校验的遍历会触发leakPassword的getter,直接把私有密码暴露出来——这完全违反了数据安全的要求。
3. 无限递归导致栈溢出
还有个更隐蔽的坑:getter如果引用自身,会引发无限递归。比如:
const recursiveObj = { get loopForever() { return this.loopForever; // 访问自身,触发无限递归 } }; funcWeGiveToUser(recursiveObj);
遍历到loopForever时,getter会不断调用自己,最终导致JavaScript引擎抛出**“栈溢出”错误**,直接让整个程序挂掉。
怎么把这些案例用起来?
你可以把这些测试用例整理好,提交给开发团队,明确指出:无校验的对象遍历完全没有防御能力,必须在遍历前添加校验逻辑——比如用Object.getOwnPropertyDescriptor()检查属性是否是getter,或者用Object.hasOwn()确保只遍历对象自身的可枚举属性,避免触发意外的getter逻辑。
内容的提问来源于stack exchange,提问作者Adelin
相关产品推荐
相关产品推荐

