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
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Julien Palard
Le #26561926
Bonjour,
Le 2020-11-28 Í  18:54, Dominique a écrit :
Tout est dans le sujet : Í  quoi sert la fonction eval par rapport Í  un
print normal ou une bête égalité.

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)
Dominique
Le #26561927
Le 04/12/2020 Í  00:31, Julien Palard a écrit :
Bonjour,
Le 2020-11-28 Í  18:54, Dominique a écrit :
Tout est dans le sujet : Í  quoi sert la fonction eval par rapport Í  un
print normal ou une bête égalité.

Les cas d'utilisation légitime sont rares, eval reste un aimant Í  faille
de sécurité.

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
Benoit Izac
Le #26561932
Bonjour,
Le 04/12/2020 Í  05:38, Dominique a écrit dans le message
Tout est dans le sujet : Í  quoi sert la fonction eval par rapport
Í  un print normal ou une bête égalité.

Les cas d'utilisation légitime sont rares, eval reste un aimant
Í  faille de sécurité.

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 :-)

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
Dominique
Le #26562030
Le 04/12/2020 Í  07:38, Benoit Izac a écrit :
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.

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
Benoit Izac
Le #26562034
Bonjour,
Le 05/12/2020 Í  05:33, 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.

Peut-être, je n'ai rien vu Í  ce sujet. Mais alors, en quoi eval est un
« aimant Í  failles » ? Je ne vois pas.

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
Dominique
Le #26562097
Le 05/12/2020 Í  08:59, Benoit Izac a écrit :
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 :-(

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
Poster une réponse
Anonyme