目前有一个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자의 기능은 귀하가 공식화했기 때문에 제3자가 사전 패키징하여 구성 요소 모듈을 사용해야 합니다.
sys.module
을 사용하여 귀하가 제공한 모듈을 제3자만 가져올 수 있습니다. 모듈은sys.module[mod] = None
가져오기가 금지되어 있습니다PS: 온라인 프로그래밍 웹사이트는 모두 샌드박스 환경에서 사용자 코드를 실행합니다. 파괴되면 어차피 환경은 가상이므로 문제와는 거의 관련이 없는 것 같습니다.
경험담 공유: 예를 들어 파일을 처리할 때 변수 경로를 사용하는 데 익숙하지만 from os 가져오기 경로를 자주 사용합니다
다음과 같이 사용할 수 있습니다.
으아아아使用ast.literal_eval(), 只允许使用 string,bytes,number,tuples,lists,discts,set,booleans,None
ast.literal_eval(node_or_string)
Python 리터럴 또는 컨테이너 표시가 포함된 문자열이나 표현식 노드를 안전하게 평가합니다. 제공된 문자열 또는 노드는 문자열, 바이트, 숫자, 튜플, 목록, 사전, 집합, 부울 및 없음과 같은 Python 리터럴 구조로만 구성될 수 있습니다.
이는 값을 직접 구문 분석할 필요 없이 신뢰할 수 없는 소스의 Python 값이 포함된 문자열을 안전하게 평가하는 데 사용할 수 있습니다. 예를 들어 연산자나 인덱싱이 포함된 임의로 복잡한 표현식을 평가할 수 없습니다.
버전 3.2의 변경 사항: 이제 바이트 및 리터럴 설정을 허용합니다.