javascript - ES2015 模板字符串安全问题

标签 javascript security ecmascript-6

这是来自 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/

相关文章:

javascript - 在应用层(使用 sequelize 或其他)如果已读取的数据(SELECT)已更改(UPDATE)则中止 SQL 事务

python - 在受控条件下使用 'exec' 是否构成安全威胁?

c++ - 如何分析、查找和修复 C++ 函数中的安全漏洞?

database - 如果密码存储为散列,那么限制密码的长度有什么好处吗?

javascript - 如何将数据传递给 page.evaluate 函数?

javascript - 如何在 Typescript 中使用break语句

javascript - Node.js:如何用 C++ 创建 ES6 模块

javascript - ISP注入(inject)广告导致js无法正常运行

javascript - 滚动条不可见且 CSS3 过渡在 MOZ 中不起作用

javascript - jQuery 爆炸效果