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

目前有一个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 中更改:现在允许字节和设置文字。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板