微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在我的游戏中安全运行用户编写的 Javascript

如何解决在我的游戏中安全运行用户编写的 Javascript

我有一个棘手的问题要解决,我做了很多研究,但我认为我还没有找到完美的答案。

我正在制作一个游戏,我计划编写一个相当大的关卡编辑器。在我的脑海中,这个关卡编辑器可能足以让我编写整个游戏。 这意味着,我只需要向该游戏编辑器添加功能即可为游戏添加功能。 到现在为止还挺好。然而,我的游戏是用 Javascript 编写的,我计划在同一个游戏引擎中制作关卡编辑器,这样我就可以将它与游戏一起发布,让玩家制作自己的关卡。 在关卡编辑器中,我计划添加脚本功能以扩展游戏的功能

这意味着,我希望关卡编辑器能够运行 Javascript。所以我希望用户能够在游戏中编写和运行 JS,也能够分享他们的关卡并让其他人玩这些关卡。

现在,这听起来很糟糕。这就是我基本上允许用户通过我的游戏进行 XSS。想了很多办法,基本上没有找到让用户安全的解决方案。

我希望他们能够访问我提供给他们的一些 JS 对象,而不是其他任何东西。我不希望他们能够访问任何其他变量,如窗口、导航器、控制台等。我只希望他们能够访问我游戏的运行时对象以及我提供给他们的任何实用程序函数。 那么,我如何才能安全地做到这一点?

解决方法

如果自定义脚本在客户端上运行,那么第一步至少是在沙箱内而不是在父页面上运行它。您可以从用户提供的脚本创建一个 web worker,然后将消息传递给工作人员,其中仅包含您希望它能够使用的信息。 Worker 在单独的环境中运行,不提供对原始页面的访问,也不提供对许多内置浏览器对象的访问。但是某些内置对象仍然可以访问,例如 window.consolewindow.fetch。如果可以接受,您可以在工作线程中运行用户的脚本,并让它将消息发布回原始页面,然后丢弃工作线程。

您也许可以使用 withnew Function 来阻止用户访问某些全局属性,但这会很乏味,我对此没有信心能够做到就是成功。

更好的方法是在真正隔离的世界中运行脚本 - 将代码发送到您的服务器,然后使用 Node 使用 vm.runInNewContext 运行脚本,并让服务器将结果发送回客户端。这提供了您需要的隔离,因为:

当您使用此功能时,它会创建一个非常有限的上下文。您需要将您想要的任何内容传递到成为全局对象的沙箱对象中。例如:如果您希望将不受信任的代码写入控制台,则需要在沙箱对象中包含控制台。

也就是说,在大多数情况下,我会首先考虑是否绝对需要运行用户的 JS。我更喜欢允许用户通过定义他们输入文本的文本格式来自定义行为。但是,如果您需要为游戏提供无限的灵活性,如果游戏很复杂,那么创建这样一种(本质上)编程语言可能会非常耗时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?