是否有一个模板引擎可以解析ES6 template literals 样式的模板? (例如 "string ${var}")而不违反脚本评估的内容安全策略 (CSP) 限制?
CSP restrictions on script evaluation防止 eval、new Function、setTimeout(string) 和 setInterval(string)。
有许多模板引擎可以提供或修改以提供类似于 ES6 风格的模板文字,例如 John Resig 的 MicroTemplates , lodash _.template 和 DoT.js .然而,所有这些似乎都通过使用 new Function 违反了 CSP。
如果 var 可以是不受限制的 Javascript,在某些方面会很方便,但由于明显的原因,这可能是不可能的。但是,我需要能够修改引擎以根据需要格式化输出。
在这种情况下,性能不是问题,预编译模板也不是一个选项。别人有discussed pre-compilation .
作为附加限制,内容是文本 - 而不是 HTML。我认为 Knockout 或 PURE 等面向 DOM 的模板引擎不会因此而无法有效工作。
我的第一个想法是从 mustache.js 开始并从那里修改它(即更改 mustache.tags = ['${', '}'] 或 DIY solution ,但我将不胜感激关于该主题的任何想法,因为那里似乎很少讨论 CSP 和模板。
最佳答案
如果您只需要键值替换,您可以使用一个简单的函数,例如我在下面提供的 templateReplace。不涉及评估,只涉及正则表达式。
如果您需要包含“无限制的 javascript”,具有类似 ${[1,2,3].join(', ')} 的内容,那么,正如您承认的那样,您显然需要违反您的 CSP 政策的解决方案。
var templateReplace = function(html, data, keyTemplate) {
if (!keyTemplate || typeof keyTemplate !== 'string' || keyTemplate.indexOf('key') === -1) {
keyTemplate = '{{key}}';
}
return (Object.keys(data) || []).reduce(function(html, key) {
var val = (data[key] !== undefined) ? data[key] : '';
return html.replace(new RegExp(keyTemplate.replace('key', key), 'gi'), val);
}, html);
};
// demo 1, using {{key}} syntax
(function() {
var li = [{ text: 'one' }, { text: 'two' }, { text: 'three' }].map(function(d) {
return templateReplace( '<li>Item: {{text}}</li>', d);
});
document.querySelector('#result1').innerHTML = li.join('\n')
}())
// demo 2, using ${key} syntax
(function() {
var helloWorld = templateReplace('${hello} ${world}', { hello: 'Hello', world: 'World!' }, '\\${key}');
document.querySelector('#result2').innerHTML = helloWorld;
}())demo 1 - {{key}} syntax
<div id="result1"></div>
demo 2 - ${key} syntax
<div id="result2"></div>
关于javascript - CSP 安全的 ES6 模板文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20232652/
我有一大串格式化数据(例如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("