4

当我在玩 XSS 挑战时,我在 Javascript 中使用模板字符串(``而不是括号)创建 Function 对象时遇到了奇怪的行为。

据我了解,调用时

alert`1`

它本质上是一样的

alert(["1"])

如此处所述。我测试了许多案例,并且在任何地方都以这种方式工作 - 除了使用模板字符串创建 Function 对象时。

执行以下代码时:

var x = new Function`alert(1)`;
console.log(x.constructor);

Object 类的实例是在其构造函数主体中使用 alert(1) 函数创建的,因此它会立即执行。

如果我理解正确,它的执行方式应该与

var y = new Function(["alert(1)"]);
console.log(y.constructor)

并且应该在正文中返回带有 alert(1) 的 Function 对象,以便它可以像这样调用

var y = new Function(["alert(1)"]);
y();

这种不一致来自哪里,或者在创建对象时模板字符串的处理方式不同?

4

1 回答 1

4

您误解了各种语言语法的优先级。

var x = new Function`alert(1)`;

相当于

var x = new (Function`alert(1)`);

所以你实际上在做的是

var fn = Function`alert(1)`;
var x = new fn;

所以你已经创建了函数,然后用new.

于 2018-08-27T19:04:37.300 回答