在一次对 JavaScript 内部机制的非常规演示中,开发者 Bartosz 分享了一种在不使用标准括号的情况下调用任意函数的方法。该技术依赖于操纵引擎处理错误堆栈追踪的方式。具体而言,它涉及覆盖 `Error.prepareStackTrace` 函数——这是一个通常由 V8 等引擎用于格式化堆栈追踪的可选 API——并将其替换为 `Function` 构造函数。这使得系统可以将某些数据结构视为可执行代码。
该机制需要额外的两个步骤来绕过典型的语法限制。首先,由于原始堆栈追踪不是有效的 JavaScript 代码,作者使用了原型污染(特别是针对 `Object.prototype.message`)并结合对 `Array.prototype.toString` 的覆盖。通过将数组的字符串表示指向 `Error.prototype.toString` 方法,有效负载可以将位置数组成功转换为所需的脚本。最后,生成的对象使用“valueOf 技巧”进行执行,即通过覆盖对象的默认 `valueOf` 方法,使其可以通过加法运算符作为原始值被调用。
虽然在技术上令人印象深刻,但这种方法在跨浏览器兼容性和可读性方面面临实际限制。评论者指出,由于 `Error.prepareStackTrace` 是主要在 V8 中实现的可选 API,该技巧可能会在 Firefox 等其他环境中失败。此外,虽然有人建议将其用于混淆或作为同行评审的试金石,但其他人指出,像 `Symbol.iterator` 这样的标准功能已经提供了在不使用括号的情况下触发逻辑的正当方法。最终有效负载的复杂性突显了该语言底层对象模型固有的极端灵活性——以及潜在的隐蔽性。
