Desinfectar la entrada del usuario en bash por motivos de seguridad
¿Cómo desinfecto la entrada del usuario en un script bash para que luego pueda pasarla como argumento a otro programa de shell? Quiero evitar lo siguiente:
INPUT="filename;rm -rf /"
ls $INPUT
Estaba pensando que debería ser suficiente rodear la entrada del usuario entre comillas dobles de esta manera:
ls "$INPUT"
Pero ¿qué pasa si hay una comilla doble en $INPUT
?
¿O bash ya se ocupa de este problema?
1 answers
El Corto
Bash ya se ocupa de eso. Citarlo es suficiente.
ls "$INPUT"
El Largo
Una guía aproximada de cómo el shell analiza esta línea es:
"ls \"$INPUT\"" # Raw command line.
["ls", "\"$INPUT\""] # Break into words.
["ls", "\"filename; rm -rf /\""] # Perform variable expansion.
["ls", "\"filename; rm -rf /\""] # Perform word splitting (no change).
["ls", "filename; rm -rf /"] # Remove quotes.
Debido a las comillas, la variable $INPUT
no sufre división de palabras. El ls
buscará un archivo llamado filename; rm -rf /
.
Si no lo citaras entonces la expansión procedería de manera diferente: {[18]]}
"ls $INPUT" # Raw command line.
["ls", "$INPUT"] # Break into words.
["ls", "filename; rm -rf /"] # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"] # Perform word splitting.
Al menos puedes tener consuelo de que esto no se ejecutará realmente rm -rf /
. Más bien, pasará cada una de esas cadenas como un nombre de archivo a ls
. Usted ls
algunos archivos que no tenía la intención, pero al menos no va a ejecutar accidentalmente comandos no deseados.
jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory
Extractos de "man bash":
CITANDO
Las citas se usan para quitar el significado especial de ciertos caracteres o palabras al shell. Las citas se pueden usar para deshabilitar el tratamiento especial para caracteres especiales, para evitar que las palabras reservadas sean reconocidas como tal, y para evitar la expansión de parámetros.
EXPANSIÓN
La expansión se realiza en la línea de comandos después de que se ha dividido en palabras. Hay siete tipos de expansión realizada: expansión de brace, expansión de tilde, expansión de parámetros y variables, comando sustitución, expansión aritmética, división de palabras y expansión de nombres de ruta.
Solo la expansión de llaves, la división de palabras y la expansión de nombres de ruta pueden cambiar el número de palabras de el expansión; otras expansiones expanden una sola palabra a una sola palabra. Las únicas excepciones a esto son las expansiones de
"$@"
y"${name[@]}"
como se explicó anteriormente (ver PARÁMETROS).División de palabras
El shell escanea los resultados de la expansión de parámetros, sustitución de comandos y expansión aritmética eso no ocurrió entre comillas dobles para dividir palabras.
Eliminación de cotizaciones
Después de las expansiones anteriores, todas las ocurrencias sin comillas de los caracteres
\
,'
, y"
que no resultado de una de las expansiones anteriores se eliminan.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-25 02:17:10