创建Function对象时奇怪的模板字符串行为

时间:2018-08-27 19:00:29

标签: javascript ecmascript-6 xss template-strings

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

据我了解,在调用

alert`1`

基本上与

相同

alert(["1"])

,如here所述。我测试了很多情况,并且在所有这种情况下都以这种方式工作-除非使用模板字符串创建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();

这种不一致的原因是什么?创建对象时模板字符串的处理方式有何不同?

1 个答案:

答案 0 :(得分:4)

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

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

等同于

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

所以您实际上要做的是

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

因此,您已经创建了函数,然后使用new对其进行了调用。