2010-05-21 11 views
6

Chcę wykonać plik .exe na moim serwerze Apache za pomocą skryptu php. procedura jest następująca:jak wykonać program .exe przez skrypt php

  1. użytkownik wchodzi, wypełnia formularz HTML

  2. to goses do skryptu php

  3. skrypt php wykonuje plik name.exe

  4. drukuje php dane wyjściowe pliku name.exe na stronie.

I wykonanie name.exe normalnie z oknami tak:

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

name.exe musi komunikować się z innymi plikami, takich jak biblioteki w tym samym katalogu.

pełna COMAND cmd w oknach jest tak:

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

następnie program wykonuje i drukuje niektóre wyniki w cmd okna.

Tak naprawdę chcę uruchomić ten program na moim serwerze z moich klientów. Nie wiem jak, ale teraz jest sposób, aby to zrobić.

Kolejne powiązane pytanie, czy istnieje jakakolwiek powłoka, którą mogę zainstalować na serwerze Linux i uruchomić w niej name.exe?

Odpowiedz

6

Proszę ponownie przemyśleć swoje rozwiązanie ponieważ prawdopodobnie spowoduje to więcej problemów (w szczególności problemów związanych z bezpieczeństwem) niż rozwiązuje.Poprzez skrypt PHP wykonać swój program uruchomić niebezpieczeństwo wprowadzając następującą do formularza użytkownika:

John Doe; rm \windows\* 

lub

John Doe; rm d:\name\* 

chcesz ograniczyć dane wejściowe użytkownika do bardzo kontrolowanej podgrupie tak że nie dostaniesz złośliwego iniekcji poleceń.

PHP zapewnia numer exec(), ale należy zachować szczególną ostrożność.

+0

dzięki, zrobię. To jest dobra rada. Mogę sprawdzić dane wejściowe za pomocą mojego formatu, zanim zezwolimy na jego wykonanie przez skrypt php. Ale czy problem można rozwiązać za pomocą 'exec()'? więc mogę uczyć się z niego korzystać. – John

+0

Wykonywanie programów zewnętrznych nie stanowi większego problemu z pewną ostrożnością i unikaniem wszystkich przychodzących danych za pomocą 'escapeshellarg()'. –

2

Prawdopodobnie chcesz passthru() lub exec().

chodzi o Linuksa, jeśli name.exe działa dobrze pod WINE, prawdopodobnie chcesz użyć passthru() lub shell_exec() i nazwać wino do uruchomienia name.exe. Nie mam pojęcia, co nazwa name.exe ma, więc nawet jeśli to działa pod WINE pod numerem, nie ma żadnej gwarancji, że faktycznie będzie to pracować.

Istnieje jednak żadna magiczna powłoka, która pozwala Linuxowi na wykonywanie dowolnych plików wykonywalnych Windows.

Jak już wspomniano, być bardzo uważać na to, co pozwoli dotrzeć do exec() lub passthru() lub cokolwiek innego, który wykonuje kod spoza skryptu. Nie zamierzam posunąć się do stwierdzenia, że ​​prawdopodobnie nie powinieneś robić tego, co robisz, ale nie jestem tym, który pracuje nad tym, nad czym pracujesz :)

+2

Nie ma również wymogu, aby PHP * nie * było uruchamiane w systemie Windows/IIS. –

+0

W rzeczywistości 'exec' zwraca ostatni wiersz po wykonaniu polecenia. Natomiast ['passthru'] (http://www.php.net/manual/en/function.passthru.php) działa tak, jak chce OP. – 0x2D9A3

+0

bardzo dziękuję Tim. – John

0

To bardzo zły pomysł. Oprócz konieczności udzielania niedorzecznych uprawnień do konta użytkownika, na którym działa twój serwer sieci web, co skutecznie daje każdemu odwiedzającemu Twoją stronę uprawnienia do uruchamiania plików wykonywalnych, Twoje ryzyko związane z bezpieczeństwem wątków, problemy z blokowaniem systemu plików i inne.

Jeśli bezwzględnie musisz użyć tego pliku exe, utwórz system kolejkowania. Niech twoja witryna umieści żądanie formularza w wygodnym repozytorium (powiedzmy, w bazie danych) i niech usługa odpytykuje bazę danych okresowo, aby uruchomić ten proces. Pozwala to na oddzielenie kont użytkowników i powiązanych uprawnień dla witryny internetowej i exe, eliminuje wszelkie problemy z równoległą realizacją i zmniejsza opóźnienie odpowiedzi dla Twojej witryny.

Niektóre języki (kaszel) umożliwiają utworzenie tej usługi i kodu witryny w tym samym języku/technologii, ale w takim przypadku będziesz musiał wyłudzić .NET lub inny skompilowany język w celu utworzenia takiej usługi. usługa.

+0

dzięki, ale moje pierwsze pytanie brzmi, czy to możliwe, że mój pomysł zadziała? następnie będę myśleć o sprawach bezpieczeństwa, jest system logowania i tylko moi przyjaciele mogą korzystać z systemu, jestem pewien bezpieczeństwa, ale mój queston jest: czy ten pomysł jest możliwy z PHP? – John

+0

John, nie ma sposobu, aby upewnić się, że tylko Twoi znajomi będą korzystać z systemu. To * dlaczego * musimy wziąć pod uwagę bezpieczeństwo w dowolnej aplikacji. Pamiętaj też, że w grze są problemy z funkcjonalnością, a nie tylko bezpieczeństwo. –

+0

Nie wiemy nic o poleceniu "name". Może to jest bezpieczne? Może uruchamia swój serwer sieciowy jako użytkownik, który ma dostęp tylko do tego polecenia. Być może program "nazwa" może mieć wiele działających procesów jednocześnie, bez problemów ze współbieżnością. Twoje punkty są nadal ważne, ale nie są nierozwiązywalne. –

2

Przed wysłaniem do polecenia należy uciec przed wprowadzeniem danych przez użytkownika przy pomocy escapeshellarg.

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

dobry punkt Emil, dzięki :) – John

0

Myślę, że możemy to zrobić, łącząc się z serwerem za pomocą PHP SSH. Istnieje biblioteka (http://phpseclib.sourceforge.net/), która umożliwia połączenie się z serwerem za pośrednictwem SSH. Wcześniej próbowałem połączyć się z serwerem za pomocą telnetu i execte .exe. Ale mój administrator szkoły zablokował telnet z powodów bezpieczeństwa, więc muszę popracować nad ssh.

Powiązane problemy