die Shutdown-Funktion in der Datei admin.php sollte meiner Meinung aus Sicherheitsaspekten geändert werden. Ich spreche von der Linux Variante. Derzeit sieht der betreffende Code-Teil so aus:
Code: Alles auswählen
private function shutdown() {
try {
if (substr(php_uname(), 0, 7) == "Windows"){
$comd = "shutdown /s /t 10";
pclose(popen("start /B ". $cmd, "r"));
}
else {
chmod("shutdown.bat", "700");
$cmd = "sh < shutdown.bat";
exec($cmd . " > /dev/null &");
}
echo json_encode(array("status" => "OK"));
} catch(Exception $e) {
echo json_encode(array("status" => "ERROR", "code" => ERROR_SCRIPT_NOT_EXECUTABLE, "msg" => ERROR_SCRIPT_NOT_EXECUTABLE_MSG));
}
}
- Dateiberechtigungen ändern dürfen - chmod("shutdown.bat", "700");
- sh (eine vollwertige Shell !!) starten dürfen - $cmd = "sh < shutdown.bat";
Ich gehe davon aus, dass man sowieso nur bei selbstgehosteten Varianten die Möglichkeit hat die Rechte des Benutzers www-data anzupassen, deshalb halte ich folgenden Ansatz für zielführender und sicherer:
- Benutzer www-data erlauben per sudo den Befehl shutdown (und nur diesen) auszuführen
- admin.php anpassen, den Befehl shutdown per sudo auszuführen
Zunächst habe ich mit dem Befehl
Code: Alles auswählen
sudo visudo
Ich habe dann folgende Zeilen am Ende der sudoers Datei angehängt:
Code: Alles auswählen
# Allow webserver to shutdown system
# so shutdown via ordersprinter website works
www-data ALL = NOPASSWD: /sbin/shutdown
Code: Alles auswählen
private function shutdown() {
try {
if (substr(php_uname(), 0, 7) == "Windows"){
$comd = "shutdown /s /t 10";
pclose(popen("start /B ". $cmd, "r"));
}
else {
system("sudo shutdown 0");
}
echo json_encode(array("status" => "OK"));
} catch(Exception $e) {
echo json_encode(array("status" => "ERROR", "code" => ERROR_SCRIPT_NOT_EXECUTABLE, "msg" => ERROR_SCRIPT_NOT_EXECUTABLE_MSG));
}
}
Meiner Meinung nach wesentlich sicherer und die Nutzung von sudo hat sich in modernen Linux-Distributionen eigentlich als Standard durchgesetzt.
Weiterhin könnte man das Webinterface erweitern, den Shutdown Befehl in verschiedenen Varianten auszuführen, z.B.
- ' shutdown -r now' für reboots
- shutdown zu bestimmter Uhrzeit
- usw.
Ich könnte mir auch vorstellen, dass ggf. die Shutdown Funktion nicht mehr direkt in der admin.php steht sondern nur als include File eingebunden wird. Das hätte den Scharm, dass Änderungen im Bereich shutdown nur an dieser Include Datei vorgenommen werden müssten und diese könnte man dann bei Updates von Ordersprinter einfach in Ruhe lassen, sodass individualisierte Shutdown-Mechanismen weiterhin funktionieren auch wenn Ordersprinter aktualisiert wird/wurde.
Vielen Dank vorab
Gruß
Peter