Wiedermal Thema "Sicherheit"
Enrico
- php
2 Sven Rautenberg0 XaraX0 Chris
Hallo,
ich erloege derzeit wohl einer Denkblockade und hoffe, dass Ihr mir weiterhelfen könnt.
Es geht immer noch um das Thema "Sicherheit" bei der PHP-Programmierung.
Um die Ausführung von Shell-Befehlen zu verhindern (ich hoffe zumindest, dass ich hier in die richtige Richtung arbeite), habe ich ein umfangreiches, mehrdimensionales Array definiert, das etliche Shell-Befehle enthält:
$Shell = array ("a" => array ("adduser",
"alias",
"arch",
"awk"),
"b" => array ("bc",
"bg",
"break",
"breaksw"),
... => ...));
Ich habe die gefundenen Befehle deshalb so organisiert, damit die Suche schneller abläuft.
Meine Überlegung geht nun in die Richtung, den Inhalt der Variablen $Feld_Inhalt zunächst anhand mehrerer Trennzeichen aufzusplitten:
$Einzelwoerter = explode (" ", $Feld_Inhalt);
Danach wird eine Schleife von 0 bis zur Anzahl der einzelnen Wörter durchlaufen und
for ($i = 0; $i < count ($Einzelwoerter); $i++)
{
Nun wird von jedem einzelnen Wort der Anfangsbuchstabe ermittelt...
$Anfangsbuchstabe = substr ($Einzelwoerter [$i], 0, 1);
... und ermittelt, ob sich das aktuelle Wort NICHT in dem Array befindet, das mit dem Anfangsbuchstaben übereinstimmt:
if (! in_array ($Einzelwoerter [$i], $Shell [$Anfangsbuchstabe]))
wenn dem so ist, dann wird das Wort einer temporären Variablen hinzugefügt:
$Temporaerer_String .= $Einzelwoerter [$i];
Am Schluss wird die Schleife wieder geschlossen und die ursprüngliche Variable $Feld_Inhalt erhält den u.U. bereinigten Code zugewiesen:
}
$Feld_Inhalt = $Temporaerer_String;
Hier der Code nochmal in einem zusammenhängenden Block:
$Einzelwoerter = explode (" ", $Feld_Inhalt);
for ($i = 0; $i < count ($Einzelwoerter); $i++)
{
$Anfangsbuchstabe = substr ($Einzelwoerter [$i], 0, 1);
if (! in_array ($Einzelwoerter [$i], $Shell [$Anfangsbuchstabe]))
$Temporaerer_String .= $Einzelwoerter [$i];
}
$Feld_Inhalt = $Temporaerer_String;
Mein Problem ist nun erstens, dass ich mit meiner explode-"Variante" nur nach dem Leerzeichen splitte.
Bekomme ich ein verfeinertes Array, wenn ich folgende Schleife einfüge ?
$Zeichen = " .,!?";
for ($i = 0; $i < strlen ($Zeichen); $i++)
{
$Einzelnes_Zeichen = substr ($Zeichen [$i], 0, 1);
$Einzelwoerter = explode ($Einzelnes_Zeichen, $Feld_Inhalt);
}
Zweitens weiss ich nicht, ob mein Vorhaben so funktioniert und / oder so überhaupt sinnvoll ist.
Bin schon gespannt auf Eure Antworten.
Gruss, Enrico
Moin!
Um die Ausführung von Shell-Befehlen zu verhindern [...]
Zweitens weiss ich nicht, ob mein Vorhaben so funktioniert und / oder so überhaupt sinnvoll ist.
Dein Vorhaben ist nicht sinnvoll.
Du willst die Ausführung von Shell-Befehlen verhindern. Dazu ist zwingend Voraussetzung, dass der Inhalt von $Feld_Inhalt gefährdend in Codeteilen verwendet wird, in denen die Ausführung von Shell-Befehlen möglich ist.
Diesen Codeteil zeigst du aber nicht.
Überdies ist dein Ansatz der optimistische: Sofern $Feld_Inhalt nicht eines der bösen definierten Worte enthält, wird er wohl in Ordnung sein. Dieser Ansatz ist gänzlich ungeeignet, denn es gibt keine abgeschlossene Menge von Shell-Befehlen, sondern unabzählbar viele - ein Shell-Befehl kann beliebig benannt werden, wenn es sich um ein separates ausführbares Programm handelt.
Mit anderen Worten: Obwohl eine Beurteilung der konkret erzeugten Sicherheit deines Codes mangels relevanter Anwendung des geprüften Ergebnisses nicht möglich ist, ist allein durch Beurteilung deines Ansatzes der Marke "Optimist" klar, dass dein Schutz keiner ist.
Definiere dein Problem. Definiere deinen vorhandenen Input, den gewünschten Output und das gewünschte Verhalten. Dann können wir weitersehen.
- Sven Rautenberg
Hallo,
Um die Ausführung von Shell-Befehlen zu verhindern (ich hoffe zumindest, dass ich hier in die richtige Richtung arbeite), habe ich ein umfangreiches, mehrdimensionales Array definiert, das etliche Shell-Befehle enthält:
PHP bietet genügent Möglichkeiten der Konfiguration, um das "Ausführung von Shell-Befehlen zu verhindern". Daher ist zu schlußfolgern, es sollen nur bestimmte Befehle an die Shell von seiten des Nutzers, für den Du programmierst, zugelassen werden. Mein Probem beim Verständis fängt da an, das der Prozess nur im Falle von root-Rechten gefährlich wir. Hat er diese den? Wenn ja - warum hat er diese?
Wird PHP als CLI-Binary benutz oder über den Server?
Gruß aus Berlin!
eddi
Moin,
schalte den Safe_Mode ein, lege open_basedir fest, und erlaube dann nur schrittweise, was Du willst.
Grüße aus dem Schnee
Der Chris