ホームページ  >  に質問  >  本文

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日前736

全員に返信(3)返信します

  • 怪我咯

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

    この質問もわかりません

    この分野の専門家に質問する必要があります。

    私が思っていることをただ話します:

    サードパーティの機能はお客様が作成するため、サードパーティを事前にパッケージ化するには、sys.module设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = Noneインポートを禁止する

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

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

    返事
    0
  • 高洛峰

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

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

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

    リーリー

    返事
    0
  • 大家讲道理

    大家讲道理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 で変更: バイトとセット リテラルが許可されるようになりました。

    返事
    0
  • キャンセル返事