JavaScript 无括号调用函数的新玩法

Yet another way to invoke functions without parentheses

我发现了一种在 JavaScript 中无需括号即可调用任意函数的新技巧。其核心原理是利用 Error 对象的 prepareStackTrace 函数来生成自定义代码,该函数通常在访问错误堆栈时被触发。由于堆栈本质上是数组,我通过覆盖 Array.prototype.toString 方法,将其转换为特定的 JavaScript 代码片段。结合原型污染技术,我成功操控了 Error.prototype.toString 的输出。最后,利用 valueOf 技巧将生成的对象作为原语调用,从而实现了无括号执行。这一系列操作展示了 JavaScript 引擎机制的巧妙利用,为代码执行提供了全新的视角。

我确信还有更多方法可以实现这一目标。
  1. hans_castorp

    这让我想起了《创造者承认 Unix 和 C 是骗局》(例如 https://www.gnu.org/fun/jokes/unix-hoax.html)

    > 当我们能用以下语法编译通过时,我们就停手了:

    for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);

  2. nathell

    我太喜欢这个了。这是个有趣的黑客技巧,但文章也让人回想起 LLM 出现之前的日子,那时人们还对 _代码_ 本身感兴趣。

  3. amelius

    我想把被调用的函数放在参数后面:

    (((x)f)g)h

    这样我就能从左到右清楚地看到事情发生的顺序。

    而不是:

    f(g(h(x)))

    那种写法我得倒着读。

  4. MattCruikshank

    我想写一本极其较真的书,展示我能想到的所有将数据从“这里”移动到“那里”的方法。无论是在同一个程序内,还是在不同程序之间。

    全局变量。

    函数参数。

    传递一个 functor/lambda,获取值。

    环境变量。

    注册表。

    文件。

    存在 ping 响应里。

    写入后读取的 VRAM 纹理。

    数据库。

    REST 服务器。

    我敢肯定我能想出上千种方法。

    但是……为什么?我为什么要写这本书?为什么这件事一直萦绕在我心头?

  5. CreepyHunterX

    这是一个很有创意的黑客技巧,而且它确实很重要。基于黑名单的净化器和 WAF 通常通过匹配字符串或正则表达式来工作,所以这类技巧通常能绕过它们。我在审计中发现过这类 XSS 漏洞,存在于由正则表达式黑名单保护的遥测字段中。真正的修复方案不仅仅是延长黑名单,而是上下文感知的输出编码(再加上 CSP 作为纵深防御)。

同日更多故事

2026-10-16