dust.js 随机用户上传的模板在服务器端执行是否安全?

dust.js are random user uploaded templates secure to execute server side?

我想让我的用户上传他们自己的灰尘模板。

现在我编译它们并将它们存储在数据库中。然后我从数据库加载它们并根据需要执行它们。

我的平台服务器端是node.js。

用户能否在模板中插入恶意数据来武装我的 运行 node.js 进程?无限循环?代码注入?

谢谢

用户生成的模板不可能包含任何邪恶或有害的内容;在大多数情况下,模板根本不会编译。模板始终编译为安全的 Dust 生成的字符串。

但是,如果您允许用户提供自己的 数据 以传递给模板,则可能存在风险。 Dust 运行s 它在渲染上下文中找到的任何函数,您可以像这样编写未转义的 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-only。

模板本身不会有害,无论是编译的还是未编译的。唯一可能的攻击是提供一个极端大小(数百 MB)的模板,并且只对您的服务器进行 DoS。

如果您提供的帮助器写得不好,如果提供了正确的模板调用,您的帮助器可能会无限期地挂起:

{@loop from=1 to=999999999999999999999999999999999999999999999}{/loop}

这个问题的解决方案是 运行 在具有超时的单独进程中进行渲染。

tl;dr 仅限模板,vanilla Dust,你很安全。