这是来自 MDN 的引述:
Template strings MUST NOT be constructed by untrusted users, because they have access to variables and functions.
还有一个例子:
`${console.warn("this is",this)}`; // "this is" Window
let a = 10;
console.warn(`${a+=20}`); // "30"
console.warn(a); // 30
这里的例子没有显示任何我能看到的漏洞。
任何人都可以举一个利用此漏洞的示例吗?
最佳答案
这毫无意义。模板字符串无权访问任何内容,也不会执行。模板字符串是语言的语法元素。
因此,动态构建模板字符串没有问题 - 这就像构建一个表达式(以任何格式,无论是代码字符串还是 AST)。 MDN 暗示的问题是评估这样的表达式(例如,使用 eval
,将其序列化为提供给用户的脚本等)——与字符串相比,它可能包含任意代码文字!但无论如何你当然不会那样做,对吗?
这个警告就像在说“使用 +
运算符的连接不能由不受信任的用户构造,因为他们可以访问变量和函数。”并给出示例""+ console.warn("this is",this) + ""
为它。好吧,这对于语言的任何表达都是如此,所以它并不是特别有趣。
当我们谈论糟糕的编码时,当然有一种情况是使用模板字符串(嘿,它们是多行等等)而不是字符串文字会导致问题:
function escapeString(str) {
return JSON.stringify(str).slice(1, -1)
.replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
}
// This is (kinda) fine!
var statement = 'var x = "Hello,\\n'+escapeString(userInput)+'";';
eval(statement); // some kind of evaluation
// But this is not:
var statement = 'var x = `Hello,\n'+escapeString(userInput)+'`;';
// ^ ^
现在假设 userInput
包含一个 ${...}
- 我们没有转义...
关于javascript - ES2015 模板字符串安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935982/