Python 应用程序的安全插件系统

2 投票
2 回答
1416 浏览
提问于 2025-04-15 11:49

我有一个用Python写的应用程序。我为这个应用程序创建了一个插件系统,使用的是egg文件。egg文件里面包含了编译好的Python文件,这些文件很容易被反编译,黑客可以利用这些文件来攻击我的应用。有没有办法来保护这个系统呢?我想使用数字签名来做到这一点——也就是给这些egg文件签名,并在加载这些文件之前检查签名。有没有办法通过Python来实现这个功能?也许可以使用winapi?

2 个回答

1

也许可以试试一些像这个的加密库 http://chandlerproject.org/Projects/MeTooCrypto,它可以帮助你构建一个临时的解决方案。使用示例可以参考这里: http://tdilshod.livejournal.com/38040.html

3

有没有办法让这个系统更安全呢?

答案是“这要看情况”。

你应该问的两个问题是:“人们应该能做什么?”和“在特定的实现中,人们能做什么?”如果存在一种实现方式,其中后者是前者的一个子集,那么这个系统就可以被保护起来。

我有个朋友正在做一个编程比赛的评测系统:这个程序会运行用户提交的代码,并用一些测试数据来检查输出结果是否与参考结果一致。这可真难以保证安全:你想运行别人的代码,但又不想让他们随意运行任何代码。你的情况是不是有点类似?如果是,那答案就是“这很困难”。

你想让用户从网上下载不可信的代码,并且希望能有一些保证,确保它不会搞坏他们的机器吗?那就要看看各种网页编程语言。一个解决方案是不给系统调用的权限(比如JavaScript),或者只提供对某些潜在危险调用的有限访问(比如Java的SecurityManager)。据我所知,Python中没有这样的做法,但你可以尝试修改解释器,禁止加载不在白名单上的外部模块。这可能会出错。

你想让用户写插件,但又不希望他们能随意修改你应用程序的主要代码吗?要考虑到用户可以反编译.pyc文件并进行修改。假设运行你代码的人总是能修改它,想想《魔兽世界》里的金农机器人。

一个仅限Linux的解决方案,类似于沙盒的网页模型,是使用AppArmor,它限制了你的应用程序可以访问哪些文件以及可以进行哪些系统调用。这可能是一个可行的解决方案,但我对它了解不多,所以只能建议你“去研究一下”。

如果你担心的是坏人在网络上传输过程中修改代码,标准的加密解决方案是存在的(比如SSL)。如果你只想加载经过签名的插件(因为你想控制用户的行为?),那么签名代码听起来是个不错的解决方案(但要小心那些狡猾的用户或坏人,他们可能会编辑.pyc文件并禁用签名检查)。

撰写回答