intérêt de la fonction eval ?
Le
Dominique

Bonsoir,
Tout est dans le sujet : Í quoi sert la fonction eval par rapport Í un
print normal ou une bête égalité.
Si je dis eval("2*5") ou x=2*5
Le seul intérêt que je semble comprendre, c'est pour résoudre une chaÍ®ne
du style eval("2*5")
Est-ce le seul ?
Merci et bonne soirée,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Tout est dans le sujet : Í quoi sert la fonction eval par rapport Í un
print normal ou une bête égalité.
Si je dis eval("2*5") ou x=2*5
Le seul intérêt que je semble comprendre, c'est pour résoudre une chaÍ®ne
du style eval("2*5")
Est-ce le seul ?
Merci et bonne soirée,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Le 2020-11-28 Í 18:54, Dominique a écrit :
Les cas d'utilisation légitime sont rares, eval reste un aimant Í faille
de sécurité.
Le gros cas d'utilisation légitime qui me vient en tête c'est pour
"interpréter" de la configuration.
Par exemple, si tu as un fichier de conf, (toml, ini, yaml, peu
m'importe), et que tu veux que ton utilisateur puisse entrer une durée
en seconde, tu peux lui permettre d'écrire :
timeout: 60 * 60 * 24
au lieu de `timeout: 86400`, qui est plus lisible. Dans ton code ça se
traduira par un :
timeout = eval(config["timeout"])
Dans la même série la configuration pourrait permettre de nommer une
classe Í utiliser pour faire une certaine chose, et utiliser
`eval(class_name)` pour instancier la classe, logging le fait par
exemple [1]:
handlers:
console:
class: logging.StreamHandler
Ou une condition :
run_at: hour < 10
qui se traduira dans le code par un :
eval(config["run_at"], {}, {"hour": datetime.datetime.now().hour})
On trouve d'autres utilisations légitimes de eval pour exécuter du code
dans un autre contexte (dans un IDE ou un débogeur par exemple) en
utilisant le 2ème et 3ème paramètre.
Ça reste des cas très spécifiques, mais suffisants pour ne pas supprimer
eval. Et je ne peux que conclure par : attention, c'est un aimant Í
failles de sécurité.
[1]: https://docs.python.org/3/howto/logging.html#configuring-logging
--
[Julien Palard](https://mdk.fr)
Je te remercie pour cette réponse très précise. Je note l'aimant Í
faille. Soyons francs, je suis Í 1000 lieues d'écrire un soft qui se
connecterait au réseau. J'en suis au dernier tiers du MOOC de FUN. C'est
te dire :-)
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Le 04/12/2020 Í 05:38, Dominique a écrit dans le message
Donc tu es plutÍ´t Í deux doigts de te connecter au réseau car, de
mémoire, il y a une présentation du module asyncio Í la fin.
--
Benoit Izac
Peut-être, je n'ai rien vu Í ce sujet. Mais alors, en quoi eval est un «
aimant Í failles » ? Je ne vois pas.
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Le 05/12/2020 Í 05:33, Dominique a écrit dans le message
Tu passes du coq Í l'Í¢ne.
eval() permet d'exécuter n'importe quel code externe au script donc sur
lequel tu n'as aucun contrÍ´le.
[WARNING: NE PAS ESSAYER !]
saisie = input('Entrez une opération : ')
print('Le résultat est :', eval(saisie))
Que se passe-il si l'utilisateur saisie la chaͮne ci-dessous ?
exec('import shutil'), shutil.rmtree('/', ignore_errors=True)
Ça va sortir un truc comme :
Le résultat est : CATASTROPHIQUE :-(
--
Benoit Izac
Ah d'accord, je comprends mieux. Je ne savais pas que eval pouvait «
avaler » un peu n'importe quoi.
Ce n'est pas grave si je ne teste pas ton exemple ? :-)
Merci,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es