Per Web Progr. auf dem (eigenen) Webserver starten

Hallo,

ich fange gerade an, mich mit PHP und JavaScript zu beschäftigen. Suche daher dort eine Lösung um per Web (Intranet/Internet) ein Programm auf meinen eigenen Webserver zu starten und ihm zwei Parameter mit zu übergeben. Das entsprechende Script soll per Button gestartet werden welches dann das Programm auf dem Server startet.
Habe schon in (gefühlten) hunderten von Foren ähnliches gelesen, aber keine Lösung hat bei mir funktioniert.

Der Server:
Windows 2003 Server, SP2, NTFS
IIS6, PHP 5, MySQL5

Der Programmpfad des zu startenden Programms auf dem Server hat die Rechte „Jeder - Lesen, Ausführen“. Das müsste doch reichen, oder?

Ein Lösungsvorschlag in PHP (…/index.php) sieht so aus:

<?php if (!empty($_POST['exec'])) {
$nr = "140"; exec("C:/Programme/teraterm/ttpmacro.exe C:/Programme/teraterm/callnst.ttl " + $nr); } ?\> Wobei die Parameterübergabe zum PHP-Script noch nicht implementiert wurde. In diesem Fall wäre es der String "140". Leider funktioniert dies auch nicht. Gibt es auch eine Lösung in JavaScript. Damit kenne ich mich ein bisschen besser aus. Vielen Dank schon mal für euere Tipps und Anregungen. Jörg

Hallo,

Leider funktioniert dies auch nicht.

Woher weißt Du, das das nicht funktioniert? Woran
würdest Du ein „Funktionieren“ erkennen?

Grüße

CMБ

Woher weißt Du, das das nicht funktioniert? Woran
würdest Du ein „Funktionieren“ erkennen?

Nun ja, die Wirkung des Programms welches gestartet werden soll bleibt aus (Es würde eine bestimmte Nebenstelle anrufen). Lokal funktioniert das Programm inkl. Makro. Des Weiteren taucht kein Prozess mit dem Namen „ttpmacro.exe“ auf.

Hallo,

<?php :if (!empty($_POST['exec'])) {
$nr = "140"; exec("C:/Programme/teraterm/ttpmacro.exe C:/Programme/teraterm/callnst.ttl " + $nr); } ?\>

Bitte, tu das nicht. Ich kenn mich nicht mit PHP aus, aber ich befürchte, dass das eine riesige Sicherheitslücke ist. Wenn der Benutzer als Wert für exec sowas wie ‚; del C:/Programme/‘ angibt kann das ziemlichen Schaden anrichten.

Ungeprüfte URL- oder POST-Parameter an die Kommandozeile zu übergeben ist fast immer ein Sicherheitsrisiko.

Und bitte denk nicht „erst bringe ich es zum laufen, danach mache ich es sicher“. Bei solchen haarigen Sachen sollte man immer zu allererst an die Sicherheit denken. Sonst passiert es, dass man eine Webanwendung schreibt, die man nachher nicht mehr sicher kriegt. Oder man vergisst es einfach, und wundert sich dann, warum die Telefonrechnung in die Höhe schnellt, oder warum man auf einer Spam-Blacklist steht.

Grüße,
Moritz

Hallo

Was steht denn im Server-Log, *warum* es nicht
gestartet werden konnte?

Grüße

CMБ

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Was steht denn im Server-Log, *warum* es nicht
gestartet werden konnte?

Tja, das ist auch ein Problem. In der php.ini steht:

log_errors = On
error_log = syslog

Daher sollte der Log zum Windows Ereignisprotokoll umgeleitet werden.
Dort finde ich aber leider nichts was irgendwie mit PHP oder ähnliches zu tun hat.

Bitte, tu das nicht. Ich kenn mich nicht mit PHP aus, aber ich
befürchte, dass das eine riesige
Sicherheitslücke ist. Wenn der Benutzer als Wert für exec
sowas wie ‚; del C:/Programme/‘ angibt kann das ziemlichen
Schaden anrichten.

Ungeprüfte URL- oder POST-Parameter an die Kommandozeile zu
übergeben ist fast immer ein Sicherheitsrisiko.

Gut, aber ich denke nicht, dass es so unsicher ist, weil

  • der PHP-Code beim User im Browser nicht zu sehen ist

  • der PHP Code nicht mehr änderbar ist und es nur ein „ungefährlicher“ Parameter übergeben wird

  • die Web-Seite nur einer gewissen (bekannten) Gruppe von Usern zugänglich sein wird (Interne Windows-Authentifizierung)

Gibt es denn Alternativen? Ich muss/will unbedingt per Web zugriff auf das Programm haben. Später vielleicht auch noch auf andere. Das eröffnet mir ungeahnte Möglichkeiten zur (Haus)-Steuerung.

Hallo,

Hmmm. An sich sollte das, was Du möchtest, gehen
Ich vermute, das ist ein IIS-Ding. Mit Apache2
wäre das sicher ziemlich einfach, sofern man
kein Windows-Vista hat. Schmeiss doch mal den
ganzen IIS-Kram runter, deaktiviere ihn (+ 5 mal
reboot) *mit Sicherheit* für http und installiere
den Apachen.

Ich habe bis jetzt einmal versucht, etwas sinnvolles
mit dem IIS zu machen, das ist (imho) einfach Murks,
der einen enormen Aufwand verursacht.

Grüße

CMБ

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

…Schmeiss doch mal den
ganzen IIS-Kram runter, deaktiviere ihn (+ 5 mal
reboot) *mit Sicherheit* für http und installiere
den Apachen.

sehr ungern, habe es geschafft PHP und MySQL ans Laufen zu bekommen, ausserdem möchte ich nicht auf die Windows-Authentifizierung verzichten.

Ich könnte auf einem anderen Server Apache installieren, der müsste dann allerdings einen anderen Standard-http-Port bekommen. Mache ich auch ungern.

Es könnte sicherlich an irgendwelchen Sicherheitseinstellungen des IIS liegen, aber an welchen???

Gruss
jörg

Also, ich bin jetzt mitlerweile so weit, dass ich sagen kann, dass die Bedingung:

if (!empty($_POST[‚exec‘])) {

nicht zutrift.
Damit wird auch

exec("C:/Programme/teraterm/ttpmacro.exe C:/Programme/teraterm/callnst.ttl " + $nr);

gar nicht erst ausgeführt.

Weiss jemand warum?

Ich hätte auch gerne statt ‚exec‘ die Rufnummer als Argument mit übertragen, wie sähe das dann aus?

Gruss
jörg

Hallo,

Bitte, tu das nicht. Ich kenn mich nicht mit PHP aus, aber ich
befürchte, dass das eine riesige
Sicherheitslücke ist. Wenn der Benutzer als Wert für exec
sowas wie ‚; del C:/Programme/‘ angibt kann das ziemlichen
Schaden anrichten.

Ungeprüfte URL- oder POST-Parameter an die Kommandozeile zu
übergeben ist fast immer ein Sicherheitsrisiko.

Gut, aber ich denke nicht, dass es so unsicher ist, weil

  • der PHP-Code beim User im Browser nicht zu sehen
    ist

„security by obscurity“ funktioniert in der Praxis nicht.

  • der PHP Code nicht mehr änderbar ist und es nur ein
    „ungefährlicher“ Parameter übergeben wird

Sobald du ihn ungeprüft an exec() übergibts wird er gefährlich.

  • die Web-Seite nur einer gewissen (bekannten) Gruppe
    von Usern zugänglich sein wird (Interne
    Windows-Authentifizierung)

Das ist schon besser :wink:

Gibt es denn Alternativen? Ich muss/will unbedingt per Web
zugriff auf das Programm haben. Später vielleicht auch noch
auf andere. Das eröffnet mir ungeahnte Möglichkeiten zur
(Haus)-Steuerung.

Also ein erster Ansatz wäre, die übergegebenen Parameter zu überprüfen. Wenn es eine Telefonnummer sein soll, welche Zeichen darf es dann enthalten? nur 0 bis 9? eventuell noch führendes +, Klammern und Leerzeichen? Prüf dagegen. Wenn irgend was anderes vorkommt, schmeiss eine Fehlermeldung raus. Damit hast du schon sehr viel gewonnen.

Grüße,
Moritz

Ich habe jetzt mal von vorne angefangen:

Folgenden Code habe ich in meine index.php eingebettet:

<?php $nr = '140';
$prog = 'C:/Programme/teraterm/ttpmacro.exe C:/Programme/teraterm/callnst.ttl '; $befehl = $prog . $nr; MsgBox($befehl); $return\_var = system($befehl); MsgBox($return\_var); ?\> Die erste MsgBox zeigt mir die richtige Befehlskette an, die zweite ist leer. Sonst passiert nichts weiter. Das gleiche Script lokal auf dem Websever ausgeführt - funktioniert. Irgendwie wird der Befehl system() nicht ausgeführt. Ebenso wenig exec(), shell\_exec() und passthru(). Daraufhin habe ich in der php.ini display\_errors = on gesetzt. Jetzt bekomme ich folgende Fehlermeldung auf der Website: Warning: exec() [function.exec]: Unable to fork [C:/Programme/teraterm/ttpmacro.exe C:/Programme/teraterm/callnst.ttl 100] in \\servername\web\telefon\index.php on line 63 Googlen brachte den Tipp die Sicherheit für die cmd.exe für das Internetgastkonto (IUSR) anzupassen. (Lesen, Ausführen zulassen und Schreiben verweigern) Hat leider auch nichts gebracht...

Hallo,

ich habe es! Da das Basisverzeichnis per UNC Pfad eingegeben war und ich dies zwischenzeitlich auf den lokalen Pfad geändert habe, habe ich schlicht die „Ausführen“-Rechte" der PHP.Datei vergessen. Dazu kommt noch, dass das eigentliche zu startende Programm die „NETZWERKDIENSTE - Lesen, Ausführen“ braucht. Tests mit „normalen“ kleinen Batch-dateien funktionieren jetzt.
Leider aber noch nicht der eigentliche Programmaufruf:

exec('C:/Programme/teraterm/ttpmacro.exe /I C:/Programme/teraterm/callnst.ttl ' . $nr); 

Es werden die beiden Programme (ttpmacro.exe und das dazugehörnde ttermpro.exe) im Task-Manager angezeigt aber sonst passiert nichts weiter. Erst Wenn ich die beiden Task „abschiesse“ gehts im PHP-Script weiter.
Es liegt wahrscheinlich daran, dass die beiden Programme mit dem Benutzername NETZWERKDIENSTE ausgeführt werden.

Wie kann ich das ändern?

Gruss
jörg

Wegem diesen Problem mache ich lieber ein neues Thema auf,

danke euch bis hierher!

Gruss
jörg