Enrico: Wiedermal Thema "Sicherheit"

Beitrag lesen

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