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?

Author: Bonifacio2, 2010-11-25

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.

 33
Author: John Kugelman,
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