Pro*_*ude 5 c# embed security ironpython
我将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___!
Run Code Online (Sandbox Code Playgroud)
我在另一个堆栈溢出帖子中读到了这个.假设不是设置__ builtins_ ._ import__为none,我将其设置为自定义函数,允许您加载标准API.
问题是,使用上面概述的方法,脚本能否有任何方式能够访问clr模块,.net BCL或其他任何可能造成坏处的事情?或者我应该修改源代码?第三种选择?
保证它的唯一方法是使用 AppDomain。我不知道性能受到什么影响;这取决于您的用例,因此您应该首先测量它以确保它实际上太慢。
如果您只需要一个尽力而为的系统,并且脚本不需要导入任何内容,并且您从主机提供了它们所需的所有对象,那么您的方案应该是可以接受的。您还可以避免运送 Python 标准库,这将节省一些空间。
您需要检查其余的内置函数是否有任何可能与外界通信的内容;open、file、input、raw_input、execfile等,但可能还有其他。exec也可能是一个问题,而且由于它是一个关键字,如果那里有空缺,关闭它可能会更困难。永远不要低估坚定的攻击者的能力!