我正在将IronPython嵌入到我的游戏引擎中,在那里你可以将脚本附加到对象上。我不希望脚本能够随时访问CLR,因为这样它们几乎可以做任何事情。
拥有随机脚本,尤其是从互联网下载的脚本,能够打开互联网连接、访问用户硬盘或修改内部游戏状态是一件非常糟糕的事情。
通常人们只会建议“使用单独的AppDomain”。然而,除非我严重错误,否则跨AppDomain是缓慢的。非常慢。对于游戏引擎来说太慢了。因此,我正在寻找替代方案。
我考虑过编译一个自定义版本的IronPython,使您无法导入clr或任何命名空间,从而将其限制在标准库中。
我更愿意采用的选项大致如下:
__builtins__.__import__ = None #Stops imports working
reload = None #Stops reloading working (specifically stops them reloading builtins
#giving back an unbroken __import___!
I read this in another stack overflow post. Assume that instead of setting __ builtins_._ import__ to none, I instead set it to a custom function that lets you load the standard API.
问题是,使用上面概述的方法,脚本是否有任何方法能够访问clr模块、.net BCL或其他可能造成不良影响的东西?或者我应该修改源代码吗?第三种选择?