>  Q&A  >  본문

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일 전733

모든 응답(3)나는 대답할 것이다

  • 怪我咯

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

    저도 이 질문을 이해하지 못하겠습니다. 이 분야의 전문가에게 물어봐야겠습니다

    제 생각을 말씀드리겠습니다.

    제3자의 기능은 귀하가 공식화했기 때문에 제3자가 사전 패키징하여 구성 요소 모듈을 사용해야 합니다. sys.module을 사용하여 귀하가 제공한 모듈을 제3자만 가져올 수 있습니다. 모듈은 sys.module[mod] = None가져오기가 금지되어 있습니다

    PS: 온라인 프로그래밍 웹사이트는 모두 샌드박스 환경에서 사용자 코드를 실행합니다. 파괴되면 어차피 환경은 가상이므로 문제와는 거의 관련이 없는 것 같습니다.

    회신하다
    0
  • 高洛峰

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

    경험담 공유: 예를 들어 파일을 처리할 때 변수 경로를 사용하는 데 익숙하지만 from os 가져오기 경로를 자주 사용합니다

    다음과 같이 사용할 수 있습니다.

    으아아아

    회신하다
    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 리터럴 구조로만 구성될 수 있습니다.

    이는 값을 직접 구문 분석할 필요 없이 신뢰할 수 없는 소스의 Python 값이 포함된 문자열을 안전하게 평가하는 데 사용할 수 있습니다. 예를 들어 연산자나 인덱싱이 포함된 임의로 복잡한 표현식을 평가할 수 없습니다.

    버전 3.2의 변경 사항: 이제 바이트 및 리터럴 설정을 허용합니다.

    회신하다
    0
  • 취소회신하다