Sven Rautenberg: php include - Pfadangabe?

Beitrag lesen

Moin!

reicht da sowas in der Art aus?:

if ($datei=="legalerwert"){
include(...);
}

Ja, _das_ ist _so_ vollkommen ok.

Was wirklich ideal ist: In der URL werden nur IDs oder Schlüsselworte übergeben, und intern hast du eine Tabelle, in der diese IDs oder Schlüsselworte in einzubindende Dateinamen übersetzt werden.

$einbinden = array(
             'index' => 'index.html',
             'impressum' => 'kontakt.html',
             'thema1' => 'thema1/index.html'
             )

Das definiert, welche Schlüsselworte existieren, und welche Dateien aufgrund dessen eingebunden werden können.

Wenn du das Schlüsselwort in $_GET['datei'] übergibst (also z.B. 'seite.php?datei=impressum'), dann kannst du die Übersetzung in eine reale Datei simpel erledigen:

readfile( $einbinden[ $_GET['datei'] ] );
(wahlweise geht natürlich auch include() an dieser Stelle)

Die Vorteile: Das Array $einbinden hat immer definierte Werte, die man nicht durch Benutzereingaben überschreiben bzw. ergänzen kann.

Und wenn undefinierte Werte für den Parameter 'datei' angegeben werden, wird nichts eingebunden. Ok, dabei entsteht möglicherweise noch eine Fehlermeldung, die man abfangen könnte:

if ($einbinden[$_GET['datei']] != "")
{
  readfile(einbinden[$_GET['datei']]);
}
else
{
  // Irgendwas ist hier falsch - aber nicht zwingend ein Angreifer am Werk
}

Du mußt halt irgendeine Prüfung einbauen, oder wissen bzw. abschätzen können, welche Konsequenzen bei falschen bzw. manipulierten Daten drohen.

Mit readfile hast du nichts zu befürchten, die angegebene Datei wird eingelesen und an der Stelle des readfile-Kommandos wieder ausgegeben. Es ist ziemlich egal, ob das nun eine interne Datei von dir ist, oder irgendeine extere URL. Bedingung wäre bei deinem ursprünglichen Namenskonstrukt ja, dass sie auf ".html" endet - also ist ausgeschlossen, dass z.B. PHP-Dateien auf diese Weise eingebunden werden. Aber diese Sicherheit existiert eben nur aufgrund des festen, unabänderlichen Namenszusatzes ".html", nicht einfach nur aufgrund des readfile-Kommandos.

Irgendwie merke ich gerade, wie wenig Ahnung ich habe ;).

Soviel Ahnung hatte ich auch mal. Aber man lernt ständig dazu. :)

- Sven Rautenberg

--
Signatur oder nicht Signatur - das ist hier die Frage!