dust.js是随机用户上传的模板,可以安全地在服务器端执行
dust.js are random user uploaded templates secure to execute server side?
我想允许我的用户上传他们自己的灰尘模板。
现在我将它们编译并存储在数据库中。然后,我从数据库中加载它们,并根据需要执行它们。
我的平台服务器端是node.js.
用户是否可以在模板中插入恶意数据,从而武装我正在运行的node.js进程?无限循环?代码注入?
感谢
用户生成的模板不可能包含任何邪恶或有害的内容;在大多数情况下,模板根本不会编译。模板总是编译成安全的,灰尘产生的字符串。
但是,如果允许用户提供自己的数据以传递给模板,则可能存在风险。Dust运行它在渲染上下文中找到的任何函数,您可以编写这样的无标题HTML:
{
"foo": function(chunk) {
return chunk.write("<script src='evil'>");
}
}
因此,用户可以在某个地方插入脚本标记并引入XSS。
如果在服务器端渲染模板,Dust会将渲染过程作为主事件循环的一部分运行,因此上下文函数可以访问当时范围内的任何内容。。。
{
"foo": function(chunk) {
console.log("I'm writing to the server console!");
dust.log("Spammin' ur logz", "ERROR");
chunk.write("I'm stealing ur keyz: " + SECRET_API_KEY);
database.eraseAllTheThings({ howMany: "all of them", yaRly: true });
}
}
为了防止这种情况,当允许用户提供自己的数据时,最好使用vm
模块将渲染与主节点脚本隔离。您也可以在单独的过程中运行渲染。或者,您可以强制数据仅为JSON。
模板本身不能是有害的、编译的或解压缩的。唯一可能的攻击是提供一个极端大小(数百MB)的模板,并只对服务器进行DoS。
如果您提供的帮助程序写得不好,那么如果提供正确的模板调用,您的帮助程序可能会无限期挂起:
{@loop from=1 to=999999999999999999999999999999999999999999999}{/loop}
解决方案是在一个单独的进程中运行渲染,并超时。
tl;dr仅限模板,vanilla Dust,您很安全。
相关文章:
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 当eval只执行服务器端数据时,在javascript中使用eval是否安全
- 拒绝执行 JavaScript URL,因为它违反了以下内容安全策略指令:
- 重入口安全异步函数的执行
- IE9本地文件系统安全阻止js执行
- 如何禁用不安全的脚本从执行chrome测试版支持CSP
- jQuery安全,在浏览器中执行代码
- 使用innerHTML插入内容不执行