我将 IronPython 嵌入到我的游戏引擎中,您可以在其中将脚本附加到对象。我不希望脚本能够随时访问 CLR,因为那样他们几乎可以做任何事情。
拥有随机脚本,尤其是从互联网下载的脚本,能够打开互联网连接、访问用户硬盘或修改内部游戏状态是一件非常糟糕的事情。
通常人们只会建议“使用单独的 AppDomain”。但是,除非我严重错误,否则跨 AppDomains 很慢。非常慢。对于游戏引擎来说太慢了。所以我正在寻找替代品。
我考虑过编译一个自定义版本的 IronPython,它会阻止您导入 clr 或任何命名空间,从而将其限制为标准库。
我宁愿选择的选项如下:
__builtins__.__import__ = None #Stops imports working
reload = None #Stops reloading working (specifically stops them reloading builtins
#giving back an unbroken __import___!
我在另一个堆栈溢出帖子中读到了这个。假设不是设置 __builtins_ 。_ import__ 为无,我改为将其设置为允许您加载标准 API 的自定义函数。
问题是,使用上面概述的方法,脚本是否有任何方法能够访问 clr 模块、.net BCL 或其他任何可能做坏事的东西?还是我应该修改源?第三种选择?