Maison >développement back-end >Tutoriel Python >Comment puis-je convertir en toute sécurité un dictionnaire de chaînes en dictionnaire Python sans utiliser « eval » ?

Comment puis-je convertir en toute sécurité un dictionnaire de chaînes en dictionnaire Python sans utiliser « eval » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-22 05:58:13174parcourir

How Can I Safely Convert a String Dictionary to a Python Dictionary Without Using `eval`?

Convertir une représentation sous forme de chaîne d'un dictionnaire en dictionnaire sans utiliser Eval

La tâche à accomplir consiste à convertir une représentation sous forme de chaîne d'un dictionnaire en un véritable dictionnaire Python. Bien que eval soit une option simple, ses failles de sécurité suscitent des inquiétudes. Cet article explore une méthode alternative utilisant la fonction ast.literal_eval intégrée.

La fonction ast.literal_eval

ast.literal_eval est une fonction conçue pour évaluer des expressions qui ne contiennent que des structures littérales telles que des chaînes, des nombres, des listes, des tuples, des dicts, des booléens et Aucun. Il offre une approche plus sûre par rapport à eval car il restreint les entrées pour éviter les risques de sécurité potentiels.

Utilisation

Pour utiliser ast.literal_eval, importez le module ast et transmettez la représentation sous forme de chaîne du dictionnaire comme argument. Par exemple, considérons la chaîne suivante :

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

Convertir cette chaîne en dictionnaire à l'aide de ast.literal_eval est aussi simple que :

>>> ast.literal_eval(s)
{'muffin': 'lolz', 'foo': 'kitty'}

Considérations de sécurité

L'utilisation d'ast.literal_eval protège efficacement contre les attaques par injection qui pourraient survenir avec eval. Eval permet à l'entrée utilisateur d'être exécutée dynamiquement en tant que code Python, augmentant ainsi le risque d'injection de code malveillant. En revanche, ast.literal_eval restreint l'entrée aux seules structures littérales, empêchant de telles attaques.

Exemple

Pour illustrer la différence, comparez les évaluations des deux expressions suivantes :

# Using eval, which can be risky
eval("shutil.rmtree('mongo')")

# Using ast.literal_eval, which is safer
ast.literal_eval("shutil.rmtree('mongo')")

Comme démontré, l'approche non sécurisée utilisant eval pourrait conduire à une erreur système critique, tandis que ast.literal_eval identifie correctement la chaîne mal formée et renvoie une erreur.

Conclusion

En résumé, ast.literal_eval offre une méthode sécurisée et efficace pour convertir les représentations sous forme de chaîne de dictionnaires dans les dictionnaires Python. Contrairement à eval, il protège contre les injections de code malveillant tout en permettant l'évaluation des structures littérales. Cela en fait un choix idéal pour gérer les entrées des utilisateurs ou les données provenant de sources non fiables.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn