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

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

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

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

用户是否可以在模板中插入恶意数据来阻止我正在运行的node.js进程? 无限循环? 代码注入?

谢谢

用户生成的模板不可能包含任何邪恶或有害的东西; 在大多数情况下,模板将无法编译。 模板总是编译成安全的,灰尘生成的string。

但是,如果您允许用户提供自己的数据传递给模板,则可能会有风险。 灰尘运行它在渲染上下文中find的任何函数,你可以写这样的非转义的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)的模板,并且只是拒绝服务器。

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

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

解决scheme是在一个单独的过程中运行渲染超时。

tl; dr模板只,香草粉尘,你是安全的。