1.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo PHP-Freunde,

folgendes schwirrt mir durch den Kopf:

Meine bisherigen Webseiten oder Anwendungen habe ich immer mit
einer
Bootstrap-Datei umgesetzt, d.h. z.B. meine index.php im Document
Root lädt
den entsprechenden Inhalt per require nach, je nachdem welchen Get-
Parameter ich der Url mitgebe.

Dabei prüfe ich, ob der Parameter gültig ist, indem ich ein Array habe
mit
den gültigen möglichen Werten.
Das dürfte soweit auch ok sein.

Nun habe ich aber eine größere alte Webseite, die ich überarbeiten
muss,
und die möchte ich nun in dieses Schema pressen. Allerdings ist es
ziemlich
aufwendig, jede neue Seite immer wieder in dieses Array einzutragen.

Daher hab ich mir überlegt, ob es nicht auch einfacher geht:


if (isset($_GET["p"])) {
if (file_exists(ABS_PATH . "/" . $_GET["p"] . ".php")) {
require ABS_PATH . "/" . $_GET["p"] . ".php";
}
}


dabei habe ich die Konstante ABS_PATH vorher schon auf ein
entsprechendes Verzeichnis gesetzt, z.b "/var/www/projekt1" und
natürlich
fehlt hier auch noch der else-Zweig etc.

Aber was spricht grundsätzlich gegen diese Vorgehensweise? Habe
irgendwas im Hinterkopf von wegen Protokoll-Wrappern, d.h. ein
Angreifer
könnte über den Parameter eine externe Datei nachladen lassen. Aber
geht
das überhaupt, wenn ich den Pfad schon absolut beim require
angebe?

Und wie machen das z.b. die ganzen MVC-Frameworks, die haben ja
letztendlich auch nur eine vorgegebene Struktur?

Für Tipps bin ich dankbar

2 Antworten

0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Du solltest auf jeden Fall bestimmte Zeichen aus dem Parameter "p" ausfiltern, z.B. ".", "/" und "\" sollten nicht erlaubt sein. Damit kannst du schon mal "directory transversal"-Lücken weitgehend verhindern.

Alternativ könntest du auch nach dem Zusammensetzen von Parameter und Wurzelverzeichnis noch mittels realpath() und anschließendem Vergleich überprüfen, ob die angeforderte Datei sich noch "unterhalb" des Wurzelverzeichnisses befindet.

MCV-Frameworks legen die angeforderte URL in der Regel auf Klassen und Methoden um, statt direkt PHP-Scripts einzubinden. Eine URL wie http://meinedomain.tld/artikel/4711 wird dann z.B. zu einem Aufruf der Methode "actionIndex()" der Klasse "ArtikelController" mit dem Parameter "4711".
0 Punkte
Beantwortet von
schon mal danke für den Tipp.

Aber nochmal wegen dem MVC:

Wenn ich das richtig in Erinnerung habe, ist jeder Controller doch eine
eigene Klasse. Und je nachdem, wie die autoload-Funktion ausgestaltet
ist, muss diese doch auch diese Datei nachladen. Denn wenn die
Klasse nicht bekannt ist, gibts doch nen Fatal Error...

Würde für das obige Bespiel bedeuten, er versucht, im Controller-
Verzeichnis die Klasse für ArtikelController zu laden.
Oder werden stur einfach alle dateien in dem Verzeichnis eingebunden,
selbst wenn sie nicht benötigt werden?

Oder hab ich da nen Denkfehler drin?
...