2009-06-11 8 views
14

estoy codificación de una interfaz web para una pieza de software horrible propiciatoria utiliza nuestra empresa. El software no tiene una interfaz de usuario real y nos exige dar acceso masivo a nuestro sistema para que nuestros clientes incluso obtengan datos. Mi interfaz web debe ejecutar una función exec(); y debe pasar algunas variables a las entradas del usuario.mejor manera de desinfectar comando exec con variables insertadas por el usuario

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; 
$last_line = exec($command, $output, $returnvalue); 

Ahora supongamos que podría ser capaz de eliminar cualquier punto y coma desde el $command varible y estar seguro, pero no estoy seguro y es por eso que estoy posando esto aquí antes de seguir en directo el próximo mes.

¿Cuál sería la mejor manera de desinfectar $command? Hay algunos caracteres especiales que debo incluir en las variables [ ] < > ! # $.

Respuesta

17

utilizar la función de PHP que tiene para este fin:

$cmd = 
    "/usr/bin/do-something " . 
    escapeshellarg($arg1) . 
    ' ' . 
    escapeshellarg($arg2); 

También puede utilizar escapeshellcmd()

Cuál es la diferencia?

escapeshellarg() SOLAMENTE agrega 'alrededor de la cadena y luego \ ante cualquier otro' caracteres. http://www.php.net/escapeshellarg

escapeshellcmd() escapa de todos los caracteres sensibles al shell ($, \, etc.) pero no agrega comillas. http://www.php.net/manual/en/function.escapeshellcmd.php

El gotcha es en el caso de que use escapeshellarg() como parte de un parámetro QUOTED. Entonces se vuelve inútil (en realidad, agrega comillas a la mezcla).

En general, se prefiere usar escapeshellcmd() con nuestras propias cotizaciones añadido.

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'"; 

¡Sé seguro!

+3

eliminado mi respuesta porque al parecer, que estaban escribiendo al mismo tiempo, pero se dieron ejemplos dignos. Enlaces a Manual: http://us.php.net/manual/en/function.escapeshellarg.php, http://us.php.net/manual/en/function.escapeshellcmd.php –

+0

Gracias, @AC - agregando los enlaces ahora – gahooa

+1

Solo una nota que 'escapeshellcmd()' en realidad no escapa '!', así que si está ejecutando el comando en, por ejemplo, Bash, aún eres vulnerable a la sustitución de comandos (por ejemplo, 'this-is-a-test-! 467' donde'! 467' será reemplazado por lo que sea que no. 467 en tu historial de shell). 'escapeshellarg()' alivia eso. – madsen

Cuestiones relacionadas