Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours737

répondre à tous(3)je répondrai

  • 怪我咯

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

    Je ne comprends pas non plus cette question. Je dois poser la question à quelqu'un qui est spécialisé dans ce domaine

    Je vous dis juste ce que je pense :

    Étant donné que les fonctions du tiers sont formulées par vous, pré-emballez le tiers pour utiliser les modules de composants. Utilisez sys.module pour définir la liste blanche des modules. Seuls les tiers sont autorisés à importer les modules que vous fournissez. il est sys.module[mod] = Noneinterdit d'importer des modules

    PS : les sites Web de programmation en ligne exécutent tous le code utilisateur dans un environnement sandbox. S'il est détruit, il le sera de toute façon, cela semble donc n'avoir pas grand-chose à voir avec votre problème

    .

    répondre
    0
  • 高洛峰

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

    Partagez une de vos expériences : Par exemple, lors du traitement de fichiers, j'ai souvent l'habitude de prendre un chemin variable, mais j'utilise souvent le chemin d'importation depuis os

    Il peut être utilisé comme ceci :

    import os.path
    
    # import os.path后, 使用时, 需要完整输入os.path
    # 相对于import os总模块而言, import os.path能避免无用的引入
    path = os.path.join("/tmp", filename)

    répondre
    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)
    Évaluez en toute sécurité un nœud d'expression ou une chaîne contenant un littéral Python ou un affichage de conteneur. La chaîne ou le nœud fourni ne peut être constitué que des structures littérales Python suivantes : chaînes, octets, nombres, tuples, listes, dicts, ensembles, booléens et Aucun.

    Cela peut être utilisé pour évaluer en toute sécurité des chaînes contenant des valeurs Python provenant de sources non fiables sans avoir besoin d'analyser les valeurs vous-même. Il n'est pas capable d'évaluer des expressions arbitrairement complexes, impliquant par exemple des opérateurs ou une indexation.

    Modifié dans la version 3.2 : autorise désormais les octets et les littéraux définis.

    répondre
    0
  • Annulerrépondre