Python如何考虑代码注入安全?
黄舟
黄舟 2017-04-18 10:19:46
0
3
762

目前有一个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特性还能获取和修改主程序任何运行函数类的源代码,从而进一步的注入。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
刘奇

這個問題我也不懂,需要問問專門做這方面的人

我只說說我的想法:

由於第三方的功能由你們制定,預先封裝好第三方需要用到組件模組,利用sys.module设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = None禁止導入

PS:線上程式網站都是在沙箱環境裡運行使用者程式碼的,破壞便破壞了,反正環境是虛擬,似乎跟你這個問題關聯不大

小葫芦

分享其中一個心得: 比如說, 文件處理時, 常習慣取個變數path, 但又常from os import path

可以這麼用:

import os.path

# import os.path后, 使用时, 需要完整输入os.path
# 相对于import os总模块而言, import os.path能避免无用的引入
path = os.path.join("/tmp", filename)
大家讲道理

使用ast.literal_eval(),只允許使用 string,bytes,number,tuples,lists,discts,set,booleans,None

ast.literal_eval(node_or_string)
安全地計算包含 Python 文字或容器顯示的表達式節點或字串。提供的字串或節點只能包含以下 Python 文字結構:字串、位元組、數字、元組、列表、字典、集合、布林值和 None。

這可用於安全地評估包含來自不受信任來源的 Python 值的字串,而無需自己解析這些值。它無法計算任意複雜的表達式,例如涉及運算符或索引。

版本 3.2 中更改:現在允許位元組和設定文字。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板