dust.js是随机用户上传的模板,可以安全地在服务器端执行

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

本文关键字:安全 执行 服务器端 随机 js 用户 dust      更新时间:2023-09-26

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

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

我的平台服务器端是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,您很安全。

相关文章: