目前有一个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特性还能获取和修改主程序任何运行函数类的源代码,从而进一步的注入。
怪我咯2017-04-18 10:21:46
この質問もわかりません
この分野の専門家に質問する必要があります。私が思っていることをただ話します:
サードパーティの機能はお客様が作成するため、サードパーティを事前にパッケージ化するには、sys.module
设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = None
インポートを禁止する
追記: オンライン プログラミング Web サイトはすべてサンドボックス環境でユーザー コードを実行します。いずれにしても環境は仮想なので、問題とはほとんど関係がないようです。
高洛峰2017-04-18 10:21:46
あなたの経験を共有してください: たとえば、ファイルを処理するとき、私は変数パスを使用することによく慣れていますが、OS からパスをインポートすることもよくあります
次のように使用できます:
リーリー大家讲道理2017-04-18 10:21:46
ast.literal_eval() を使用、ただ允许 string、bytes、number、tuple、lists、discts、set、booleans、None を使用します
ast.literal_eval(node_or_string)
Python リテラルまたはコンテナ表示を含む式ノードまたは文字列を安全に評価します。提供される文字列またはノードは、文字列、バイト、数値、タプル、リスト、辞書、セット、ブール値、およびなしの Python リテラル構造のみで構成されます。
これは、値を自分で解析する必要なく、信頼できないソースからの Python 値を含む文字列を安全に評価するために使用できます。演算子やインデックス付けなど、任意の複雑な式を評価することはできません。
バージョン 3.2 で変更: バイトとセット リテラルが許可されるようになりました。