Python 有办法“安全地”import 别人提供的包吗

2020-02-12 07:15:58 +08:00
 black11black

如题, 标题里所谓“安全地”指的是在载入阶段不运行任何用户级代码,只做单纯的载入。

比如我们写包的时候经常会把除了 class 和 def 外的其他部分,用if __name__ == '__main__':包裹起来,做的就是这种工作。让我们只是单纯地执行 import,而后续的工作可以在 import 后根据已经导入的实际情况分析判断之后再做决定。。

这个问题可能面对的情况有两种,其一是我设计框架开放了一个插槽,允许用户插入自定义脚本。那么我希望在导入阶段并不会直接开始“因为某些用户书写脚本的疏漏”,而直接开始运行某几句代码,以避免发生任何不可控的问题。

另一个情况比如说我们从网上下载开源库,虽然 pypi 不像 npm 那样发展到遍地病毒的程度,但是毕竟也允许上传自定义二进制文件。。。所以出于安全考量我们希望只是单纯地引入 class 和 function,不执行任何一句代码。

====================

总之,有比较优雅的方式实现吗?

==================== 我能想到的比较丑陋的办法就是自己实现一个简单的解释器,读入库文本进行预 parsing,但是怎么想都感觉很蛋疼。

1160 次点击
所在节点    问与答
4 条回复
Trim21
2020-02-12 07:19:17 +08:00
然后别人在类的定义内部下毒,你这办法还是绕不过去
crella
2020-02-12 07:43:48 +08:00
这个好像还真没什么办法
Cbdy
2020-02-12 08:00:49 +08:00
没有办法,全靠自觉
phy25
2020-02-12 08:49:53 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX