目前有一个python的项目,想加入第三方插件开发的一个功能。 插件的形式也就是一个PY文件,但是看了python安全这块的文章后,发现python是动态的,很容易就注入到核心代码,包括各种monkeypack之类的,如何做这块才能安全呢?
PS: 现在有些在线课堂也有 在线编程的功能,他们怎么做到的安全呢?
# plug_hello.py
def hello():
print "hello world"
# load.py
import plug_hello
plug_hello.hello()
正常这样加载是没问题,但是黑客就可以注入。
# plug_hello.py
def hello():
#在 Python 2中, 内置对象可以通过魔法 __builtins__ 模块进行访问。一个已知的手段就是利用 __builtins__ 的可变性,这可能引起巨大灾难
import __builtins__
__builtins__.False, __builtins__.True = True, False
print "hello world"
黑客这样写,整个程序的True 和 False 变量就会出问题,而且黑客使用py特性还能获取和修改主程序任何运行函数类的源代码,从而进一步的注入。
這個問題我也不懂,需要問問專門做這方面的人
我只說說我的想法:
由於第三方的功能由你們制定,預先封裝好第三方需要用到組件模組,利用
sys.module
设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = None
禁止導入PS:線上程式網站都是在沙箱環境裡運行使用者程式碼的,破壞便破壞了,反正環境是虛擬,似乎跟你這個問題關聯不大
分享其中一個心得: 比如說, 文件處理時, 常習慣取個變數path, 但又常from os import path
可以這麼用:
使用ast.literal_eval(),只允許使用 string,bytes,number,tuples,lists,discts,set,booleans,None
ast.literal_eval(node_or_string)
安全地計算包含 Python 文字或容器顯示的表達式節點或字串。提供的字串或節點只能包含以下 Python 文字結構:字串、位元組、數字、元組、列表、字典、集合、布林值和 None。
這可用於安全地評估包含來自不受信任來源的 Python 值的字串,而無需自己解析這些值。它無法計算任意複雜的表達式,例如涉及運算符或索引。
版本 3.2 中更改:現在允許位元組和設定文字。