El uso a eval
menudo se desaconseja porque permite la ejecución de código arbitrario. Sin embargo, si usamos eval echo
, entonces parece que el resto de la cadena se convertirá en argumentos, por echo
lo que debería ser seguro. ¿Estoy en lo correcto en esto?
20
-n
, puede hacerlo con una variable sin comillas comoecho $arguments
o si$arguments
es una matrizecho "${arguments[@]}"
. El uso noeval echo
tiene sentido, incluso si fuera seguro.Respuestas:
Contraejemplo:
Los argumentos arbitrarios
echo
podrían haber hecho algo más nefasto que crear un archivo llamado "foo".fuente
DANGEROUS="hello;ls"
para comandos arbitrarios en lugar dels
.DANGEROUS='$(ls)'
(puede ser necesario escapar más).eval echo '"'"$DANGEROUS"'"'
? Parece que en goo.gl/L2pPQPDANGEROUS='">foo"'
).@Celada ha proporcionado una excelente respuesta. Para demostrar
eval
es realmente malo, aquí hay algo más nefasto que crear un archivo llamado "foo" :Y, por supuesto, puede haber algo más nefasto que algo más nefasto que crear un archivo llamado "foo" .
fuente
"$THIS"
lugar de simplemente tenerla como$THIS
si ni siquiera ayuda!eval echo '"'"$DANGEROUS"'"'
. Pruébalo en goo.gl/L2pPQP>foo
, porque "crear un archivo llamado 'foo'" no es necesariamente todo lo que>foo
hace. La única diferencia real que tiene su ejemplo es que no deja un archivo vacío. Los contenidos aún se han ido.No, no siempre es seguro. Una evaluación podría ejecutar cualquier comando.
Un comando seguro, como este (la fecha no se ejecuta ya que está entre comillas simples):
Se vuelve peligroso si se usa con eval:
Por supuesto, la fecha podría ser cualquier comando.
Una forma de mejorar esto es citar adicionalmente los argumentos para evaluar:
Pero generalmente es difícil citar correctamente dos veces una expresión.
Y se vuelve imposible controlar la cita correcta si un atacante externo puede establecer la expresión, como:
fuente
Si bien es cierto que
eval
siempre se debe abordar con precaución, laeval echo
construcción no siempre es inútil y se puede usar de manera segura. Recientemente lo necesitaba para evaluar múltiples expansiones de llaves en el orden en que las necesitaba.bash
realiza expansiones de llaves múltiples de izquierda a derecha, entoncesse expande a
pero necesitaba la segunda expansión de llaves primero, produciendo
Lo mejor que se me ocurrió hacer fue
Esto funciona porque las comillas simples protegen el primer conjunto de llaves de la expansión durante el análisis de la
eval
línea de comando, dejándolos expandidos por la subshell invocada poreval
.Puede haber algún esquema astuto que implique expansiones de llaves anidadas que permita que esto suceda en un solo paso, pero si es así, soy demasiado viejo y estúpido para verlo. También hay otros depósitos
bash
que permiten formas más ordenadas de lograr este tipo de cosas. Pero, en cualquier caso, este uso deeval
es seguro porque sus argumentos son cadenas fijas que no contienen expansiones de parámetros.fuente
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg