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

目前有一个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インポートを禁止する

を使用する必要があります。

追記: オンライン プログラミング Web サイトはすべてサンドボックス環境でユーザー コードを実行します。いずれにしても環境は仮想なので、問題とはほとんど関係がないようです。

いいねを押す +0
小葫芦

あなたの経験を共有してください: たとえば、ファイルを処理するとき、私は変数パスを使用することによく慣れていますが、OS からパスをインポートすることもよくあります

次のように使用できます:

リーリー
いいねを押す +0
大家讲道理

ast.literal_eval() を使用、ただ允许 string、bytes、number、tuple、lists、discts、set、booleans、None を使用します

ast.literal_eval(node_or_string)
Python リテラルまたはコンテナ表示を含む式ノードまたは文字列を安全に評価します。提供される文字列またはノードは、文字列、バイト、数値、タプル、リスト、辞書、セット、ブール値、およびなしの Python リテラル構造のみで構成されます。

これは、値を自分で解析する必要なく、信頼できないソースからの Python 値を含む文字列を安全に評価するために使用できます。演算子やインデックス付けなど、任意の複雑な式を評価することはできません。

バージョン 3.2 で変更: バイトとセット リテラルが許可されるようになりました。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート