Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的游戏中安全运行用户编写的Javascript_Javascript_Html_Security_Xss_Game Engine - Fatal编程技术网

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

在我的游戏中安全运行用户编写的Javascript,javascript,html,security,xss,game-engine,Javascript,Html,Security,Xss,Game Engine,我有一个很难解决的问题,我做了很多研究,我认为我还没有找到一个完美的答案 我正在做一个游戏,我计划写一个相当大的级别编辑器。在我看来,这个关卡编辑器可能足够强大,我可以用它来编写整个游戏。 这意味着,我只需要在游戏编辑器中添加新功能,就可以在游戏中添加新功能。 到目前为止,一切顺利。然而,我的游戏是用Javascript编写的,我计划在同一个游戏引擎中制作关卡编辑器,这样我就可以将它与游戏一起发布,让玩家自己制作关卡。 在这个关卡编辑器中,我计划添加脚本功能来扩展游戏的功能 这意味着,我希望级别

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

我正在做一个游戏,我计划写一个相当大的级别编辑器。在我看来,这个关卡编辑器可能足够强大,我可以用它来编写整个游戏。 这意味着,我只需要在游戏编辑器中添加新功能,就可以在游戏中添加新功能。 到目前为止,一切顺利。然而,我的游戏是用Javascript编写的,我计划在同一个游戏引擎中制作关卡编辑器,这样我就可以将它与游戏一起发布,让玩家自己制作关卡。 在这个关卡编辑器中,我计划添加脚本功能来扩展游戏的功能

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

这听起来很糟糕。这是我基本上允许用户通过我的游戏做XSS。我已经想到了很多方法,但基本上,我还没有找到任何解决方案来允许用户安全地完成这项工作

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

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

您可能可以通过使用
with
new Function
等shenanegans来阻止用户访问某些全局属性,但这样做会很乏味,我不相信能够成功完成

更好的方法是在真正孤立的环境中运行脚本—将代码发送到服务器,使用Node运行脚本,并让服务器将结果发送回客户端。这提供了所需的隔离,因为:

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


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

这是在前端运行的吗?为什么不将不可访问的变量放在函数范围内,将可编辑的变量放在全局范围内?看看这个:@julianleineyes@Clvckl3s因为总有办法欺骗范围并进入全球范围。我不能指望望远镜能保护我,这是个糟糕的主意。这让我思考。我发现了一个使用沙盒iframe的浏览器化版本的vm,并写了这样一篇文章:现在我想知道是否有办法让我在iframe中运行的代码脱离沙盒。我正在调查