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

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

黄舟
黄舟

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

membalas semua(3)
刘奇

Saya juga tidak faham soalan ini. Saya perlu bertanya kepada seseorang yang pakar dalam bidang ini

Saya cuma beritahu anda apa yang saya fikir:

Memandangkan fungsi pihak ketiga dirumuskan oleh anda, pra-pakej pihak ketiga perlu menggunakan modul komponen Gunakan sys.module untuk menetapkan senarai putih modul Hanya pihak ketiga yang dibenarkan mengimport modul yang anda sediakan modul adalah sys.module[mod] = Nonedilarang mengimport

PS: Tapak web pengaturcaraan dalam talian semuanya menjalankan kod pengguna dalam persekitaran kotak pasir Jika ia dimusnahkan, ia akan musnah juga, jadi ia nampaknya tidak ada kaitan dengan masalah anda

小葫芦

Kongsi salah satu pengalaman anda: Contohnya, semasa memproses fail, saya sering menggunakan laluan berubah-ubah, tetapi saya sering menggunakan laluan import os

Ia boleh digunakan seperti ini:

import os.path

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

使用ast.literal_eval(), 只允许使用 rentetan,bait,nombor,tuple,senarai,disk,set,boolean,Tiada

ast.literal_eval(node_or_string)
Menilai dengan selamat nod ungkapan atau rentetan yang mengandungi literal Python atau paparan bekas. Rentetan atau nod yang disediakan hanya boleh terdiri daripada struktur literal Python berikut: rentetan, bait, nombor, tupel, senarai, dict, set, boolean dan Tiada.

Ini boleh digunakan untuk menilai rentetan yang mengandungi nilai Python dengan selamat daripada sumber yang tidak dipercayai tanpa perlu menghuraikan nilai itu sendiri. Ia tidak mampu menilai ungkapan kompleks yang sewenang-wenangnya, contohnya melibatkan pengendali atau pengindeksan.

Diubah dalam versi 3.2: Kini membenarkan bait dan set literal.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan