- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
模板字面量对我来说有点像 eval,它经常被引用为 using eval is a bad idea .
我不关心 performance of template literals ,但我担心注入(inject)攻击(以及我可能没有想到的其他安全问题)。
编辑
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++
,它会记录
Starting: 1
You input: ii+=1
After template literal: 1
After eval: 2
编辑3
我已经开始研究 ECMAScript 规范
虽然我没有摸索细节,但感觉模板文字的指定比 eval 更安全。
最佳答案
与 eval
的一个区别是模板文字在编译时解析,而 eval
的参数仅在运行时解析,当 eval
被执行。
与此相关的是,eval
可以获得动态构建的参数,而模板文字是... literal:它不能存储为模板 变量,您可以动态构建、四处移动并最终解析:没有“模板变量”数据类型。标记函数实际上并没有获取模板变量作为参数,而是它的解析组件,这些组件在编译时是已知的。
使用 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 ("enter some evil function name (suggestion: 'alert')");
var param = prompt ("now provide an argument for " + func);
`${window[func](param)}`;
但很明显,程序自愿开启了在全局对象上执行任何函数的可能性。那么确实,您正在接近 eval
的邪恶。
请注意,同样的效果可以通过以下方式实现:
window[name](param);
如评论所述,那么您不妨将此模板设为文字:
`eval(str)`;
...因此,邪恶的部分并不在模板文字中,而是您设计在其中的通用函数调用。为此,您不需要模板文字或 eval
,而是一个糟糕的程序员 ;-)
你举了这个例子:
let ii = 1;
function counter() {
return ii++;
}
console.log(`${counter()}, ${ii++}, ${counter()}`);
这会执行您的 counter
函数,但与 eval
的区别在于字符串文字在设计时已经存在,并且无法在运行时构造.此代码旨在增加您的计数器,并且与以下代码没有本质区别:
console.log(counter() + ', ' + (ii++) + ', ' + counter());
为了强调编译/运行时解析的区别,请注意您不能使用没有有效语法的模板文字来运行代码。
比较这两个脚本:
alert('press OK');
eval('alert("hello)');
和:
alert('press OK');
`${alert("hello)}`;
注意语法错误。第一个脚本只会在解析 eval
的参数时在运行时注意到语法错误,而第二个脚本甚至不会运行,并立即给出语法错误。
更准确地说,eval
执行一个新脚本,它有自己的编译和运行阶段。模板文字像其他代码一样被解析/编译。
关于javascript - ES6 模板文字比 eval 更安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37243791/
在我看来 eval()受到与 goto 相同的蔑视。由 eval ,我的意思是将字符串作为代码执行的函数,如在 PHP、Python、JavaScript 等中看到的。是否有使用 eval() 的情况
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有几十个条件(例如,foo > bar)需要在 DataFrame 的 ~1 MM 行上进行评估,最简洁的方法编写此代码是为了将这些条件存储为字符串列表,并创建 bool 结果的 DataFrame
我正在创建一种编译为字节码并在自定义 VM 上运行的小型语言,其架构在很大程度上受到了我所阅读的有关 Python 和 Lua 的影响。有两个堆栈 - 一个存储函数参数、局部变量和临时值的数据堆栈,以
我正在尝试运行此代码: var aaa = await page.$$eval(selector, list => (list, value) => { return reso
我知道标题听起来很复杂,但为了保持动态,这是有目的的;) 示例(请注意,假定这些示例代码位于外部 eval 内) //Ex1 this works eval('function test (){}')
这是交易,我们有一个很大的 JS 库需要压缩,但是 YUI compressor如果发现“eval”语句,它不会完全压缩代码,因为担心它会破坏其他东西。这很好,但是我们确切地知道什么正在被评估,所以我
每门计算机科学类(class)中都讲授过这一点,并且在许多书籍中都写到程序员不应使用 GoTo。甚至还有一个 xkcd关于它的漫画。我的问题是我们是否达到了可以对 Eval 说同样的事情的地步? Go
这两种方法中的一种是否必须被优先使用,还是仅取决于口味? #!/usr/bin/env perl use warnings; use strict; use DBI; my $db = 'sqlite
如果存在“eval()”,uglify 不会破坏变量。命令行: uglifyjs script/script.js --compress --mangle --unsafe/path/to/scrip
我刚刚开始使用 Julia。我正在尝试使用 eval(在 Julia 中)来在函数中定义一组变量。假设我想将 v1 设置为 2: function fun_test(varargs...) v1
这个问题在这里已经有了答案: When is JavaScript's eval() not evil? (27 个答案) 关闭2 年前。 我从未遇到过需要 eval() 的情况。 人们常常说 []
这个问题在这里已经有了答案: "Variable" variables in JavaScript (9 个回答) Use dynamic variable names in JavaScript
好的 - 我有一个非常具体的案例,我需要使用 eval()。在人们告诉我我根本不应该使用 eval() 之前,让我透露一下我知道 eval 的性能问题、安全问题和所有这些问题。我在非常狭窄的情况下使用
我的问题是关于 JavaScript 闭包和 Eval() 函数。 我有一些看起来像这样的代码,还有一些其他 jQuery 插件相关的代码没有显示。如果需要,我可以用更多代码更新问题。 var _Cu
...或者有更好的方法来实现记忆化吗? Function.memoize = function(callableAsString) { var r = false, callable,
当我尝试在jmeter中执行以下代码时: import org.json.JSONArray; import org.json.JSONObject; String jsonString = prev
根据Mozilla docs为了使用 eval 执行函数,它必须被包装在 ( ) 中,即如果您不使用它们,那么它将被视为字符串. eval as a string defining function
标题看起来很蠢,但我不知道如何准确表达,抱歉。 我有一个程序需要评估一些用户代码(通过 RestrictedPython 以确保安全),并且我想将一个函数放入评估的全局变量中,以便它可以在评估时向我打
以下需要在函数范围内,因为在交互式控制台模式下不会发生奇怪的行为。 以下函数按预期返回 5 (function() { var x = 5; return eval("x"); })() 一个简单透明
我是一名优秀的程序员,十分优秀!