Python如何考虑代码注入安全?
问题描述
目前有一个python的项目,想加入第三方插件开发的一个功能。 插件的形式也就是一个PY文件,但是看了python安全这块的文章后,发现python是动态的,很容易就注入到核心代码,包括各种monkeypack之类的,如何做这块才能安全呢?
PS: 现在有些在线课堂也有 在线编程的功能,他们怎么做到的安全呢?
# plug_hello.pydef hello(): print 'hello world'
# load.pyimport plug_hello plug_hello.hello()
正常这样加载是没问题,但是黑客就可以注入。
# plug_hello.pydef hello(): #在 Python 2中, 内置对象可以通过魔法 __builtins__ 模块进行访问。一个已知的手段就是利用 __builtins__ 的可变性,这可能引起巨大灾难 import __builtins__ __builtins__.False, __builtins__.True = True, False print 'hello world'
黑客这样写,整个程序的True 和 False 变量就会出问题,而且黑客使用py特性还能获取和修改主程序任何运行函数类的源代码,从而进一步的注入。
问题解答
回答1:这个问题我也不懂,需要问问专门做这方面的人
我只说说我的想法:
由于第三方的功能由你们制定,预先封装好第三方需要用到组件模块,利用sys.module设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = None禁止导入
PS:在线编程网站都是在沙箱环境里运行用户代码的,破坏便破坏了,反正环境是虚拟,貌似跟你这个问题关联不大
回答2:分享其中一个心得: 比如说, 文件处理时, 经常习惯取个变量path, 但又经常from os import path
可以这么用:
import os.path# import os.path后, 使用时, 需要完整输入os.path# 相对于import os总模块而言, import os.path能避免无用的引入path = os.path.join('/tmp', filename)回答3:
使用ast.literal_eval(), 只允许使用 string,bytes,number,tuples,lists,discts,set,booleans,None
ast.literal_eval(node_or_string)Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.
This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not capable of evaluating arbitrarily complex expressions, for example involving operators or indexing.
Changed in version 3.2: Now allows bytes and set literals.
相关文章:
1. javascript - react 中绑定事件和阻止事件冒泡2. java - .jsp页面用<%= %>的方式获取数据存在一个很奇怪的问题3. javascript - git clone 下来的项目 想在本地运行 npm run install 报错4. css3 - css line-height和font-size高度问题,谁能帮忙解释一下呢5. vue.js - nginx怎么修改跨域配置?6. 一道使用算法解决的java题(关于hashmap的问题)7. css3 - border-bottom 的长度可否超过盒子的宽度呢?实现如下图效果。(我的书下面的线)8. javascript - requestAnimationFrame如何控制帧速?9. java - 读写锁中 写锁的降级问题10. vue.js - weex 没有背景图片属性怎么办?

网公网安备