gpt4 book ai didi

c# - 嵌入式 IronPython 安全

转载 作者:太空狗 更新时间:2023-10-29 23:09:40 25 4
gpt4 key购买 nike

我正在将 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__ 设置为 none,而是将其设置为允许您加载标准 API 的自定义函数。

问题是,使用上面概述的方法,脚本是否有任何方法能够访问 clr 模块、.net BCL 或任何其他可能做坏事的东西?还是我应该修改源代码?第三种选择?

最佳答案

保证它的唯一方法是使用 AppDomain。我不知道性能受到什么影响;这取决于您的用例,因此您应该先对其进行测量以确保它实际上太慢了。

如果您只需要一个尽力而为的系统,并且脚本不需要导入任何东西,并且您从主机提供了它们需要的所有对象,那么您的方案应该是可以接受的。您还可以避免运送 Python 标准库,这将节省一些空间。

您需要检查其余的内置函数,看是否有任何可能与外界对话的内容; openfileinputraw_inputexecfile 浮现在脑海中,但是可能还有其他人。 exec 也可能是一个问题,因为它是一个关键字,如果那里有空缺,关闭它可能会更棘手。永远不要低估坚定的攻击者的能力!

关于c# - 嵌入式 IronPython 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com