首頁  >  問答  >  主體

Python如何考虑代码注入安全?

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

黄舟黄舟2740 天前735

全部回覆(3)我來回復

  • 怪我咯

    怪我咯2017-04-18 10:21:46

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

    我只說說我的想法:

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

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:21:46

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

    可以這麼用:

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:21:46

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

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

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

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

    回覆
    0
  • 取消回覆