我想为我的自定义解释器制作网络 REPL。让我解释一下我的想法。当用户在浏览器中编写代码然后单击“评估”按钮时,代码会通过用 JS 编写的 linter 和验证器(验证器和 linter 将作为单独的模块),如果 OK 代码通过 ajax 发送到服务器。然后在服务器上为该代码评估创建单独的环境。评估该代码后,结果返回给浏览器。所以我不知道的是如何以及使用什么工具为客户端代码评估创建单独的环境。如果那是对的,我的问题是:我应该在服务器上做什么才能安全地运行客户端代码?我想与主要操作系统分开。也许 docker 可以提供帮助?
请您参考如下方法:
使用一些不错的 HTTP 服务器库,例如 libonion .一定要好好理解HTTP .
即使您在 JavaScript 中进行了客户端验证,也不要相信它并在服务器端重复验证。恶意用户可以发送直接 HTTP 请求(在您的 AJAX 之外)。
使用 session 和 cookie 来识别(在服务器中)各种客户端浏览器,并为每个浏览器保留一个单独的环境(用于您的服务器端解释器)。在实现可重入解释器时考虑到( session 和环境的)隔离。
容器化(使用 docker)是一种额外的安全措施,但即使没有它,也要将您的服务器端代码设计为安全的(因此请检查那里的所有内容)。
如果您还没有阅读它们,请阅读 SICP , Dragon Book , Lisp in Small Pieces , Programming language pragmatics , GC handbook还有这个blog article ,在概念上与 that one 非常相关(但使用非常不同的术语和方法,并且间接相关) .
I want to make web REPL for my custom interpreter.
然后您甚至可以从 1980 年代获得更多灵感 Mentor system (和相关的,甚至更老的,Centaur 一个)。我的Bismon draft report解释了更多的方式和原因,但是你需要从它的标题中抽象出来并跳过它的前几页,这是欧洲 H2020 所要求的。官僚。我个人对 Mentor 和 Centaur 的看法是,那里描述的想法比他们的时代提前了 25 年以上,而且考虑到当前计算机的能力(比计算机强 1000 倍)在 1980 年代)值得复活那些旧观念。我认为,这些想法的实用性和实用性失败的主要原因可能是 1980 年代的工作站缺乏计算机能力。
附言。另见 this .
