Maison >développement back-end >Tutoriel Python >La fonction « eval() » de Python est-elle sûre lors de la gestion de chaînes non fiables ?

La fonction « eval() » de Python est-elle sûre lors de la gestion de chaînes non fiables ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-01 14:40:10749parcourir

Is Python's `eval()` Function Safe When Handling Untrusted Strings?

Eval() en Python : risques de sécurité liés aux chaînes non fiables

Introduction

Le Python La fonction eval() permet l'exécution de code dynamiquement à partir d'une chaîne. Bien que polyvalent, il présente des risques de sécurité importants lors de l'évaluation de chaînes non fiables. Cet article examine ces risques et propose des mesures d'atténuation potentielles.

Risques de sécurité liés aux chaînes non fiables

1. Accessibilité des méthodes de classe à partir de l'objet Foo (eval(string, {"f": Foo()}, {}))

Oui, ce n'est pas sûr. L'accès à la classe Foo à partir de son instance via eval(string) offre la possibilité d'accéder à des modules sensibles tels que os ou sys à partir d'une instance Foo.

2. Atteindre les éléments intégrés via Eval (eval(string, {}, {}))

Oui, cela est également dangereux. Eval peut accéder à des fonctions intégrées comme len et list, qui peuvent être exploitées pour accéder à des modules dangereux comme os ou sys.

3. Suppression des éléments intégrés du contexte d'évaluation

Il n'existe aucun moyen viable de supprimer entièrement les éléments intégrés du contexte d'évaluation en Python.

Atténuations

1. Validation minutieuse des chaînes

Validez minutieusement les chaînes fournies par l'utilisateur pour empêcher l'exécution de code malveillant.

2. Variables locales restreintes

Utilisez le paramètre locals de eval() pour restreindre les variables disponibles dans la chaîne évaluée.

3. Fonction d'évaluation sécurisée personnalisée

Implémentez une fonction d'évaluation personnalisée en bac à sable qui restreint l'accès aux modules et objets sensibles.

Alternatives à eval()

Envisagez des alternatives à eval(), telles que as :

  • exec() avec des mesures de sécurité supplémentaires en place.
  • ast.literal_eval() pour évaluer des expressions simples.
  • modules de sérialisation pour la transmission de données en toute sécurité.

Conclusion

Eval() avec des chaînes non fiables présente des risques de sécurité importants. Mettez en œuvre des mesures d’atténuation rigoureuses ou envisagez des approches alternatives lors de la gestion du code fourni par l’utilisateur. N'oubliez pas que eval() ne doit être utilisé qu'en cas d'absolue nécessité.

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