¿Cómo aceptar las entradas del usuario para su uso en el terminal de forma segura?

3

Encontré una vulnerabilidad y no estoy seguro de cómo parchearla. Actualmente acepto la entrada del usuario y la uso para crear un comando de terminal que ejecuto en el servidor. Aquí está el código simplificado.

// Get user input
$monochromeThreshold = $_POST['monochromeThreshold'];
$originalFile = $_POST['originalFile'];
$monochromeLocation = $_POST['monochromeLocation'];

// Create command
$command = 'convert -density 150 -threshold ' . $monochromeThreshold . '% -fuzz 1% -transparent white ' . $originalFile . ' ' . $monochromeLocation;

// Execute command
$out = system($command);

¿Hay alguna forma de sanear la entrada del usuario o tomar otras medidas para evitar la inyección en el terminal con confianza?

    
pregunta Goose 13.06.2016 - 22:27
fuente

2 respuestas

1

Php tiene algunas funciones de escape para usar los datos proporcionados por el usuario en los comandos, escapeshellcmd 1 y escapeshellarg 2 . Sin embargo, hay algunas limitaciones al usar estas funciones. Si se usa con un comando que tiene interruptores de línea de comando inseguros. Escribí una publicación de blog detallada al respecto 3 .

También debe asegurarse de que su instalación de imagemagick esté actualizada y configurada correctamente para evitar la explotación del reciente imagetragick 4 y popen () 5 vulnerabilidades.

    
respondido por el wireghoul 14.06.2016 - 01:04
fuente
1

Creo que debería hacer dos tipos de medidas de seguridad para evitar la inyección.

1. En primer lugar, valide los datos de entrada, debe usar una lista blanca o lista negra, piense en cuál es la mejor manera de controlar sus datos de entrada, la lista blanca se usa generalmente para validar los datos de entrada, porque es más fácil determinar cuál es el formato correcto para los datos de entrada. Te recomiendo usar expresiones regulares como esta:

$originalFile = $_POST['originalFile'];
$regex = "/[a-zA-Z1-9]{1,10}(\.)((jpg)|(gif))/";

if (preg_match($regex, $originalFile)) {
   //correct input data
}

2. En segundo lugar, habrá caracteres que no puedes evitar usar en tu código, entonces deberías usar las funciones de escape, el lenguaje PHP tiene algunas opciones, debes visitar la página oficial, creo que esta función podría ayudar usted:

enlace

Espero que esta información te ayude, buena suerte.

    
respondido por el hmrojas.p 14.06.2016 - 15:33
fuente

Lea otras preguntas en las etiquetas