【发布时间】:2016-09-11 15:29:02
【问题描述】:
对我来说,模板字面量有点像 eval,而且经常引用 using eval is a bad idea。
我不关心performance of template literals,但我关心注入攻击(以及我可能没有想到的其他安全问题)。
编辑
An example of something that feels odd to me
let ii = 1;
function counter() {
return ii++;
}
console.log(`${counter()}, ${ii++}, ${counter()}`);
哪些输出
1、2、3
模板字面量在全局层面产生副作用。既可以通过函数,也可以直接。
编辑 2
An example indicating the saferness of template literals
let ii = 1;
let inc = function() { ii++; }
console.log('Starting: ' + ii);
let input = prompt('Input something evil (suggestion: inc() or ii++)');
console.log(`You input: ${input}`);
console.log('After template literal: ' + ii);
eval(input);
console.log('After eval: ' + ii);
如果你在提示时输入ii++,它会记录
开始:1
你输入:ii+=1
模板文字之后:1
评估后:2
编辑 3
我已经开始研究 ECMAScript 规范
-
18.2.1 - Function Properties of the Global Object :: Eval (x)
- 注意它在全局对象上
- 请注意,下一节是关于 eval 的“运行时语义”
-
12.2.9 - Primary Expression :: Template Literals
- 注意这是一个表达式
- 注意下一节是关于 TemplateStrings 的“静态语义”
虽然我没有深入了解细节,但感觉模板文字的指定比 eval 更安全。
【问题讨论】:
-
要问这样的问题,你必须首先了解使用 eval 的危险。动态危险概念在其他攻击如sql注入中也是相同的。我在这里要说的是,概念是一样的。这是你如何使用它的问题。
-
您真正关心的是什么?模板字面量比
eval()更严格,因为它们(通常)所做的只是评估表达式并将结果强制转换为字符串。 -
我一直避免使用 eval,而且我刚接触 ES6,所以我不确定从哪里开始真正了解模板文字的潜在危险/陷阱。它们的预期用途感觉更安全,但在评估模板文字与 eval 的方式上是否存在实际限制?
-
模板文字在概念上比其他任何东西都更接近字符串连接。是什么让您认为它们与 eval 相关?你当然可以从我想的模板和 eval 构造一个字符串。
-
eval将任意字符串作为代码运行。我不认为你可以用模板文字做到这一点。它们是完全不同的东西。
标签: javascript ecmascript-6 eval template-literals