L'utilisation eval
est souvent déconseillée car elle permet l'exécution de code arbitraire. Cependant, si nous l'utilisons eval echo
, il semble que le reste de la chaîne deviendra des arguments, echo
donc cela devrait être sûr. Ai-je raison là-dessus?
20
-n
, vous pouvez simplement le faire avec une variable non citée commeecho $arguments
ou si$arguments
c'est un tableauecho "${arguments[@]}"
. L'utilisationeval echo
est inutile même si elle était sûre.Réponses:
Contre-exemple:
Les arguments arbitraires
echo
auraient pu faire quelque chose de plus néfaste que la création d'un fichier appelé "foo".la source
DANGEROUS="hello;ls"
:, pour les commandes arbitraires à la place dels
.DANGEROUS='$(ls)'
(plus d'échappement peut être nécessaire).eval echo '"'"$DANGEROUS"'"'
marcherait? Il semble sur goo.gl/L2pPQPDANGEROUS='">foo"'
).@Celada a fourni une excellente réponse. Démontrer que
eval
c'est vraiment mal, voici quelque chose de plus néfaste que de créer un fichier appelé "foo" :Et bien sûr, il peut y avoir quelque chose de plus néfaste que quelque chose de plus néfaste que de créer un fichier appelé "foo" .
la source
"$THIS"
au lieu de simplement l'avoir comme$THIS
n'aide pas du tout!eval echo '"'"$DANGEROUS"'"'
. Essayez-le sur goo.gl/L2pPQP>foo
, car «créer un fichier appelé 'foo'» n'est pas nécessairement tout ce qui se>foo
passe. La seule vraie différence de votre exemple est qu'il ne laisse pas de fichier vide derrière. Le contenu est toujours parti.Non c'est pas toujours sûr. Un eval pourrait exécuter n'importe quelle commande.
Une commande sûre, comme celle-ci (la date n'est pas exécutée car elle est entre guillemets simples):
Devient dangereux s'il est utilisé avec eval:
Bien sûr, la date pourrait être n'importe quelle commande.
Une façon d'améliorer cela est de citer également les arguments à eval:
Mais il est généralement difficile de citer correctement deux fois une expression.
Et il devient impossible de contrôler la citation correcte si l'expression peut être définie par un attaquant externe, comme:
la source
S'il est vrai que cela
eval
doit toujours être abordé avec prudence, laeval echo
construction n'est pas toujours inutile et peut être utilisée en toute sécurité. J'en avais récemment besoin pour faire évaluer plusieurs extensions d'accolade dans l'ordre où je les avais fait.bash
fait plusieurs expansions d'accolade de gauche à droite, doncs'étend à
mais j'avais besoin que la deuxième extension de l'orthèse soit faite en premier, donnant
Le mieux que j'ai pu faire pour le faire était
Cela fonctionne parce que les guillemets simples protègent le premier ensemble d'accolades de l'expansion pendant l'analyse de la
eval
ligne de commande, les laissant être développés par le sous-shell invoqué pareval
.Il peut y avoir un schéma astucieux impliquant des extensions d'accolades imbriquées qui permet que cela se produise en une seule étape, mais s'il y en a, je suis trop vieux et stupide pour le voir. Il y a aussi des coquilles autres que celles
bash
qui permettent des façons plus ordonnées de réaliser ce genre de chose. Mais dans tous les cas, cette utilisation deeval
est sûre car ses arguments sont tous des chaînes fixes qui ne contiennent aucune extension de paramètre.la source
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg