模板字面量对我来说有点像 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/
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("