javascript - 让用户在 Node js 中注册 Handlebars 助手的安全方法

标签 javascript node.js handlebars.js eval

我有一个使用 Handlebars 的 Node js Web 应用程序。用户要求我让他们注册自己的 Handlebars 助手。

我对是否让他们这么做感到非常犹豫……但如果有一种安全的方法,我会尝试一下。

var Handlebars = require("handlebars");
var fs = require("fs");
var content = fs.readFileSync("template.html", "utf8");


//This helper will be posted by the user
var userHandlebarsHelpers = "Handlebars.registerHelper('foo', function(value) { return 'Foo' + value; });"

//eval(userHandlebarsHelpers); This I do not like! Eval is evil

//Compile handlebars with user submitted Helpers
var template = Handlebars.compile(content);
var handleBarContent = template({ foo: bar });


//Save compiled template and some extra code.

提前谢谢您!

最佳答案

因为助手只是 Javascript 代码,所以您可以在服务器上安全地从外部世界运行任意 Javascript 的唯一方法是,您要么在一个隔离的沙箱进程中运行它,要么在运行之前以某种方式清理代码。

前者可以通过隔离的虚拟机和对进程的外部控制来完成,但这使得在某些外部进程中拥有帮助程序代码变得非常痛苦,因为你现在必须开发方法来调用它并来回传递数据.

当您的 API 集与 Node.js 一样大时,清理 Javascript 以防止在您的服务器上运行漏洞几乎是一项不可能完成的任务。浏览器有一组非常严格控制的 Javascript 可以执行的操作,以确保底层系统免受浏览器 Javascript 可以执行的操作的影响。 Node.js 没有这些保障措施。您可以将代码放入这些帮助程序之一中,以删除服务器的整个硬盘驱动器或安装多个病毒或几乎任何您想要编码的邪恶漏洞。因此,运行任意 Javascript 根本不安全。

根据需要解决的具体问题,人们可以开发一种数据驱动的方法,用户可以提供一些更高级别的指令集(而不是代码)(将这个映射到那个,用那个替换这个,替换这个)这样,从这组数据中显示,等等...),这实际上不是 Javascript,而是一些不可执行的元数据。这对于确保安全来说更加可行,因为您可以控制作用于该元数据的所有代码,因此您只需确保处理元数据的代码不会被欺骗去做一些邪恶的事情。

关于javascript - 让用户在 Node js 中注册 Handlebars 助手的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773981/

相关文章:

javascript - 何时返回函数的值?

javascript - 如何清理多个空格/换行符?

javascript - Jenkins 中的单元测试 Express 应用程序

node.js - 使用 Nodejs 和 Socket IO 的多人游戏

javascript - 无法将命令链接到 Node 脚本文件,没有这样的文件或目录

symfony-2.1 - 使用 symfony 2.1 和 Assetic 管理和包含 Handlebars.js 文件

javascript - Jasmine 的 beforeEach 是同步的吗?

javascript - 如何在 Jest/Vue-test-utils 测试中导入/包含插件?

javascript - ember Js 中的自动补全文本

Ember.js:处理模型中的大量属性