bash - comandos - cuál es el formato del archivo/etc/passwd
Desinfecte la entrada del usuario en bash por motivos de seguridad (1)
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 /
filename; rm -rf /
.
Si no lo citó, la expansión se procedería de manera diferente:
"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 puede tener consuelo de que esto no ejecutará realmente rm -rf /
. Por el contrario, pasará cada una de esas cadenas como un nombre de archivo a ls
. ls
algunos archivos que no pretendías, pero al menos no ejecutarán 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":
COTIZACIÓN
Citar se usa para eliminar el significado especial de ciertos caracteres o palabras en el caparazón. Las cotizaciones se pueden usar para deshabilitar el tratamiento especial de caracteres especiales, evitar que las palabras reservadas se reconozcan como tales y evitar la expansión de parámetros.
EXPANSIÓN
La expansión se realiza en la línea de comando después de haber sido dividida en palabras. Hay siete tipos de expansión realizadas: expansión de llaves, expansión de tilde, expansión de parámetros y variables, sustitución de comandos, expansión aritmética, división de palabras y expansión de nombres de rutas.
Solo la expansión de llaves, la división de palabras y la expansión del nombre de ruta pueden cambiar el número de palabras de la 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).Palabra dividida
El shell explora los resultados de la expansión de parámetros, la sustitución de comandos y la expansión aritmética que no se produjo entre comillas dobles para la división de palabras.
Quitar la cita
Después de las expansiones anteriores, se eliminan todas las ocurrencias sin comillas de los caracteres
/
,''
y"
que no resultaron de una de las expansiones anteriores.
¿Cómo saneo la entrada del usuario en un script bash para poder pasarlo como argumento a otro programa shell? Quiero prevenir lo siguiente:
INPUT="filename;rm -rf /"
ls $INPUT
Estaba pensando que debería ser suficiente para rodear la entrada del usuario entre comillas dobles, como sigue:
ls "$INPUT"
pero ¿y si hay una comilla doble en $INPUT
?
¿O bash ya se ocupa de este problema?