Javascript ES6模板文本是否比eval更安全?

Javascript ES6模板文本是否比eval更安全?,javascript,ecmascript-6,eval,template-literals,Javascript,Ecmascript 6,Eval,Template Literals,对我来说,模板文字闻起来有点像eval,这经常被引用 我不关心,但我关心的是注入攻击(以及我可能没有想到的其他安全问题) 编辑 哪个输出 1,2,3 模板文字在全局级别产生副作用。既可以通过函数,也可以直接 编辑2 如果在提示时输入ii++,它将记录 起点:1 您输入:ii+=1 在模板文本之后:1 评估后:2 编辑3 我已经开始研究ECMAScript规范 请注意,它位于全局对象上 注意,下一节是关于eval的“运行时语义” 注意,这是一个表达式 注意,下一节是关于Templ

对我来说,模板文字闻起来有点像eval,这经常被引用

我不关心,但我关心的是注入攻击(以及我可能没有想到的其他安全问题)

编辑

哪个输出

1,2,3

模板文字在全局级别产生副作用。既可以通过函数,也可以直接

编辑2

如果在提示时输入
ii++
,它将记录

起点:1

您输入:ii+=1

在模板文本之后:1

评估后:2

编辑3

我已经开始研究ECMAScript规范

    • 请注意,它位于全局对象上
    • 注意,下一节是关于eval的“运行时语义”
    • 注意,这是一个表达式
    • 注意,下一节是关于TemplateString的“静态语义”

虽然我不是在摸索细节,但感觉指定的模板文字比eval更安全。

如果您关心的是这一点,模板文字会自动转义引号。它们也不求值或执行任何东西,它们将您输入的任何东西转换为字符串。如果您担心SQL注入,请尝试使用模板文本执行此操作,您将看到它们被转义


你应该避免使用eval,除非你有很好的理由使用它,并且你真的知道你需要它来实现你的目标。否则最好避免

eval
的一个区别是,模板文本在编译时被解析,而
eval
的参数仅在运行时执行
eval
时被解析

与此相关的是,
eval
可以获得一个动态构建的参数,而模板文本是。。。文字:它不能存储为模板变量,您可以动态构建、移动并最终解析模板变量:没有“模板变量”数据类型。标记函数实际上并没有获取模板变量作为参数,而是它的已解析组件,这些组件在编译时是已知的

一些例子 使用
eval
可以出现以下情况:

var code = prompt('enter some evil code');
eval(code);
但这在模板文本中是不可能的:

var literal = prompt('enter some evil template literal');
tag literal; // there is no data type or syntax for this.
`${literal}`; // and this just gives you the entered string.
可能的情况是:

var str = prompt('enter some string');
tag`${str}`;
但这不会导致不必要的代码执行,至少不会比这更糟:

var str = prompt('enter some string');
myfunc(str);
任何函数调用都必须以模板文本的形式进行编码。字符串变量的值不能改变这一点。模板文本无法调用变量函数。这:

`${func(str)}`;
…将调用
func
,并且只调用该函数。它是由程序员选择的

一个相当邪恶的模板文字 尽管如此,这仍然是可能的:

var func=prompt(“输入一些邪恶的函数名(建议:'alert')”);
var param=prompt(“现在为“+func”提供一个参数);

`${window[func](param)}`我认为eval模板文本之间有一个很大的区别

eval可以计算无法从代码中直接看到的动态表达式。这使得它很危险,因为您可以计算可能出现的任何字符串 从任何地方:客户端/第三方/db

但是,在模板文本的情况下,情况有所不同

  • 因为您可以从代码中看到完整的模板
  • 表达式与内部对象一起工作,无法计算动态表达式
例如,这将适用于eval

函数doSomething(){
console.log('HELLO!');
}
//这会奏效的。
var表达式='doSomething()';
eval(表达式);

要问这样的问题,您必须首先了解使用eval的危险。动态危险概念在其他攻击(如sql注入)中也是一样的。我想说的是,这个概念是一样的。这是你如何使用它的问题。你到底关心什么?模板文字比
eval()
要严格得多,因为它们(通常)所做的只是计算表达式并将结果强制为字符串。我一直避免使用eval,而我只是来谈谈ES6,所以我不确定从哪里开始真正了解模板文字的潜在危险/陷阱。它们的预期用途让人感觉更安全,但在如何计算模板文字和评估模板文字方面是否存在实际限制?从概念上讲,模板文字比其他任何东西都更接近字符串连接。是什么让你认为它们与评估有关?你当然可以从一个模板中构造一个字符串,然后像我想象的那样进行求值。
eval
以代码的形式运行任意字符串。我认为你不能用模板文字来做这件事。它们是完全不同的东西。喜欢最邪恶的模板文字:)“最邪恶的模板文字”当然应该建议
eval
。@trincot-谢谢你在这里所做的一切努力!编译与运行时对我来说是一个重要的观点。我已经对我的问题进行了更深入的编辑,但我已经对模板文本感觉更好了:)SQL注入和模板文本:
var str = prompt('enter some string');
myfunc(str);
`${func(str)}`;