2009-08-18 16 views
10

Estoy tratando de conseguir que exec trabaje en un servidor de Windows y reciba el mensaje de error "no se puede bifurcar". Después de buscar en Google un poco, parece que la solución recomendada es otorgar a la cuenta IUSR los permisos LEER y EJECUTAR a c: \ Windows \ System32 \ cmd.exe.¿Es seguro PHP exec?

Pero eso tiene que ser un importante agujero de seguridad ¿no? ¿Es seguro? ¿Hay alguna otra forma de ejecutar [desde php] un exe que reside en el servidor?

Respuesta

14

que necesita para ejecutar cmd.exe porque cuando el PHP en Windows ve esto:

exec("foo -bar -baz"); 

Se llama a esto:

cmd /c foo -bar -baz 

Es sólo un agujero de seguridad si se deja que su usuario introduzca los parámetros. Es decir, que no debe hacer esto:

// DO NOT DO THIS! 
exec("foo -bar=" . $_GET['bar']); 

lugar, se debe desinfectar sus parámetros con escapeshellarg.

// This is okay. (Be sure foo.exe can handle unexpected input!) 
exec("foo -bar=" . escapeshellarg($_GET['bar'])); 
+4

La función exec es tan segura como la realiza. Mientras uses las funciones de escape adecuadas como se muestra aquí, estarás bien. –

+1

Si bien es posible hacer que los comandos de script sean seguros, un vector de ataque común es cargar un script malicioso y usar 'exec' y funciones similares para hackear el servidor. Como tal, muchos entornos de alojamiento compartido desactivan esta y cualquier otra función que pueda ejecutar un argumento de shell. – Machavity

1

Una cosa que debe tener en cuenta es que la creación de un proceso en Windows incurre en más gastos indirectos que lo hace en los sistemas operativos de clase de Unix. Si tiene una gran cantidad de usuarios, llamar repetidamente al exec() podría empantanar el servidor. Si prevé una gran carga en su servidor, es posible que desee considerar tener un proceso de trabajo ejecutándose continuamente como Windows service

+0

El mismo problema puede ocurrir en Windows y Linux. – Brad