La plupart des langues modernes (qui sont en quelque sorte interprétées) ont une sorte de fonction d' évaluation . Une telle fonction exécute un code de langue arbitraire, la plupart du temps passée comme argument principal sous forme de chaîne (différentes langues peuvent ajouter plus de fonctionnalités à la fonction eval).
Je comprends que les utilisateurs ne devraient pas être autorisés à exécuter cette fonction ( modifier, c'est-à-dire prendre directement ou indirectement une entrée arbitraire d'un utilisateur arbitraire à transférer eval
), en particulier avec un logiciel côté serveur, car ils pourraient forcer le processus à exécuter du code malveillant. De cette manière, les tutoriels et les communautés nous disent de ne pas utiliser eval. Cependant, eval est souvent utile et utilisé:
- Règles d'accès personnalisées aux éléments logiciels (IIRC OpenERP dispose d'un objet
ir.rule
pouvant utiliser du code python dynamique). - Calculs et / ou critères personnalisés (OpenERP a des champs comme celui-ci pour permettre des calculs de code personnalisés).
- Analyseurs de rapport OpenERP (oui, je sais que je vous fais peur avec OpenERP, mais c’est le principal exemple que j’ai).
- Coder les effets des sorts dans certains jeux de rôle.
Ils sont donc utiles, dans la mesure où ils sont utilisés correctement. L'avantage principal est que cette fonctionnalité permet aux administrateurs d'écrire du code personnalisé sans avoir à créer davantage de fichiers et à les inclure (bien que la plupart des frameworks utilisant des fonctionnalités eval disposent également d'un moyen de spécifier un fichier, un module, un package, ... à lire).
Cependant, eval est un mal dans la culture populaire. On pense à des choses comme une intrusion dans votre système.
Cependant, il existe d'autres fonctions qui pourraient être néfastes si les utilisateurs y avaient accès: déconnexion, lecture, écriture (sémantique de fichier), allocation de mémoire et arithmétique de pointeur, accès au modèle de base de données (même sans prendre en compte les cas injectables en SQL).
Donc, en gros, la plupart du temps quand tout code est pas écrit correctement ou non surveillé correctement (ressources, les utilisateurs, les environnements, ...), le code est mal et peut même conduire à l' impact économique.
Mais il y a quelque chose de spécial avec les eval
fonctions (quelle que soit la langue).
Question : Existe-t-il un fait historique pour que cette peur fasse partie de la culture populaire, au lieu d’accorder la même attention à d’autres caractéristiques potentiellement dangereuses?
eval
, il dispose d'une fonction interne appelée safe_eval
qui prépare l'environnement à empêcher le code de faire des choses dangereuses. Des bogues ont été trouvés, cependant, car Python est un langage assez flexible, et donc difficile à contrôler.