2010-05-21 45 views
6

Quiero ejecutar un archivo .exe en mi servidor Apache utilizando un script php. el procedimiento es el siguiente:cómo ejecutar un programa .exe mediante script php

  1. usuario entra, llena un formulario HTML

  2. que goses a un script php

  3. script php ejecuta el archivo name.exe

  4. impresiones php el resultado del archivo name.exe en la página.

ejecuto el name.exe normalmente desde las ventanas de esta manera:

run--> cmd--> D:\name [command]

la name.exe necesita comunicarse con otros archivos, como las bibliotecas en el mismo directorio.

el COMAND completa en cmd en Windows es la siguiente:

D:\name library.dll [input from user]

continuación, el programa ejecuta e imprime algunos resultados en la ventana de cmd.

De hecho, quiero ejecutar este programa en mi servidor de mis clientes. No sé cómo, pero ahora hay una manera de hacer esto.

Otra pregunta relacionada, ¿hay algún shell que pueda instalar en el servidor Linux y ejecutar name.exe en él?

Respuesta

6

Por favor reconsidera tu solución ya que esto probablemente creará más problemas (particularmente problemas de seguridad) de lo que resuelve.Al tener un script PHP ejecutar su programa se ejecuta el peligro de un usuario que introduce lo siguiente en su forma:

John Doe; rm \windows\* 

o

John Doe; rm d:\name\* 

Usted desea limitar la entrada del usuario a un subconjunto muy controlado de manera que no recibirá inyección de comandos maliciosos.

PHP proporciona un exec() pero tenga mucho cuidado.

+0

gracias lo haré. Ese es un buen poit. Puedo verificar la entrada con mi formato antes de permitir que se ejecute mediante el script php. Pero, ¿el problema se puede resolver con 'exec()'? entonces puedo estudiar usarlo. – John

+0

Ejecutar programas externos no es un gran problema con cierto cuidado y escapar todos los datos entrantes con 'escapeshellarg()'. –

2

Probablemente desee passthru() o exec().

En cuanto a Linux, si name.exe funcione bien con WINE, es probable que desee utilizar passthru() o shell_exec() y llame Wine para correr name.exe. No tengo idea de lo que hace Name.exe, por lo que incluso si ejecuta en WINE, no hay garantía de que realmente funcione .

No existe, sin embargo, un shell mágico que permita a Linux ejecutar ejecutables arbitrarios de Windows.

Como se ha señalado, será muy cuidado con lo que permite llegar a exec() o passthru() o cualquier otra cosa que se ejecuta el código fuera de su script. No voy a ir tan lejos como para decir que probablemente no deberías estar haciendo lo que sea que estés haciendo, pero no soy el que está trabajando en lo que sea que estés trabajando :)

+2

Tampoco es necesario que PHP * not * se ejecute en Windows/IIS. –

+0

En realidad, 'exec' devolverá la última línea después de la ejecución del comando. Mientras que ['passthru'] (http://www.php.net/manual/en/function.passthru.php) funciona como OP quiere. – 0x2D9A3

+0

muchas gracias Tim. – John

0

Esta es una muy mala idea. Además de tener que otorgar permisos ridículos a la cuenta de usuario en la que se ejecuta su servidor web, lo que efectivamente le permite a cualquiera que visite su sitio ejecutar ejecutables, puede correr el riesgo de problemas de seguridad, problemas de bloqueo del sistema de archivos y otros.

Si absolutamente debe usar este exe, cree un sistema de cola. Haga que su sitio coloque la solicitud de formulario en un repositorio conveniente (por ejemplo, una base de datos) y haga que un servicio realice un sondeo de la base de datos periódicamente para ejecutar este proceso. Esto permite la separación de cuentas de usuario y permisos asociados para el sitio web y el exe, elimina cualquier problema de ejecución concurrente y disminuye la latencia de respuesta para su sitio.

Algunos idiomas (tos) le permiten crear este servicio y el código de su sitio en el mismo idioma/tecnología, pero en este caso deberá crear el .NET u otro lenguaje compilado para crear dicho servicio. Servicio.

+0

gracias, pero mi primera pregunta es ¿es posible, mi idea funcionaría? entonces pensaré en cuestiones de seguridad, hay un sistema de inicio de sesión y solo mis amigos pueden usar el sistema, estoy seguro de la seguridad, pero mi pregunta es: ¿esa idea es posible con PHP? – John

+0

John, no hay forma de asegurarse de que solo sus amigos usen el sistema. Es por eso * que estamos obligados a considerar la seguridad en cualquier aplicación. Además, tenga en cuenta que hay problemas de funcionalidad en juego, no solo seguridad. –

+0

No sabemos nada sobre el comando 'nombre'. Tal vez es seguro? Tal vez él ejecuta su servidor web como un usuario que solo tiene acceso a ese comando. Tal vez el programa 'nombre' puede tener múltiples procesos en ejecución a la vez sin problemas de concurrencia. Sus puntos siguen siendo válidos, por supuesto, pero no son irresolubles. –

2

Debería escapar de la entrada del usuario con escapeshellarg antes de enviarlo al comando.

$saferinput = escapeshellarg($input); 
system('D:\name library.dll '.$saferinput); 
+0

buen punto Emil, gracias :) – John

0

Creo que podemos hacer esto conectándose al servidor usando PHP SSH. Hay una biblioteca (http://phpseclib.sourceforge.net/) que le permite conectarse al servidor a través de SSH. Anteriormente traté de conectarme al servidor usando telnet y execte .exe. Pero el administrador de mi escuela ha bloqueado Telnet por razones de seguridad, así que tengo que trabajar en ssh.

Cuestiones relacionadas