Wie sicher ist dieser php include?
Saanve
- php
0 frankx2 Christian Seiler0 Saanve
Hallo zusammen,
ich verwende ein xtcommerce Shopsystem und möchte im Contentbereich HTML-Seiten mit php include Anweisungen darstellen. Hierzu gibt es im Backend des Shopsystems einen sog. Contentmanager mit dem man HTML-Seiten in den jeweiligen Content-Bereich laden kann.
Mit: <?php include("/ordner/textdatei.txt"); ?> lade ich den Content (Text) an die entsprechende Stelle in dem HTML-Dokument. Die Textdateien befinden sich in einem Unterordner. Soweit funktioniert auch alles wunderbar.
Nur wie sieht es mit der Sicherheit aus?
Ich habe des öfteren von 'Risiken' in Verbindung mit der include-Anweisung gelesen. Leider kenne ich mich mit PHP zu wenig aus um beurteilen zu können, ob diese Vorgehensweise 'sicher' ist?!
Ich wäre sehr dankbar wenn mir jemand sagen könnte ob diese Art den Content einzubinden evtl. 'gefährlich' ist bzw. wie die Anweisung aussehen sollte, damit diese kein Risiko darstellt.
Dank&Gruß
Saanve
Hellihello Saanve,
na wenn ich habe mein_script.php?seite=seite3
und ich Script dann schlicht schreibe:
include ($_GET['seite]), dann könnte eine fremde Resource eingebunden werden, wenn die Servereinstellungen das nicht verhindern.
Solange alles im System passiert, und nix von aussen via Forms ungecheckt eingebunden wird, kommt ja keiner an Dein System ran, und wer nicht rankommt, kann nicht manipulieren, wenn er nicht FTP-Zugang o-ä. hätte.
ich verwende ein xtcommerce Shopsystem und möchte im Contentbereich HTML-Seiten mit php include Anweisungen darstellen. Hierzu gibt es im Backend des Shopsystems einen sog. Contentmanager mit dem man HTML-Seiten in den jeweiligen Content-Bereich laden kann.
Mit: <?php include("/ordner/textdatei.txt"); ?> lade ich den Content (Text) an die entsprechende Stelle in dem HTML-Dokument. Die Textdateien befinden sich in einem Unterordner. Soweit funktioniert auch alles wunderbar.
Nur wie sieht es mit der Sicherheit aus?
Ich habe des öfteren von 'Risiken' in Verbindung mit der include-Anweisung gelesen. Leider kenne ich mich mit PHP zu wenig aus um beurteilen zu können, ob diese Vorgehensweise 'sicher' ist?!
Ich wäre sehr dankbar wenn mir jemand sagen könnte ob diese Art den Content einzubinden evtl. 'gefährlich' ist bzw. wie die Anweisung aussehen sollte, damit diese kein Risiko darstellt.
Dank und Gruß,
frankx
Hallo!
Mit: <?php include("/ordner/textdatei.txt"); ?> lade ich den Content (Text) an die entsprechende Stelle in dem HTML-Dokument. Die Textdateien befinden sich in einem Unterordner. Soweit funktioniert auch alles wunderbar.
Nur wie sieht es mit der Sicherheit aus?
Ich habe des öfteren von 'Risiken' in Verbindung mit der include-Anweisung gelesen. Leider kenne ich mich mit PHP zu wenig aus um beurteilen zu können, ob diese Vorgehensweise 'sicher' ist?!
Ja und nein. Der Standardfehler bei include, dass fremde Inhalte über sogenantes URI injection geladen werden können, tritt nicht auf (siehe Franks Posting). Denn Du schreibst ja einen festen Wert dahin, also include 'WERT' und nicht include $VARIABLE.
Allerdings: Ganz so einfach ist das ganze nicht. Denn die Frage ist: Wie kommt "/ordner/textdatei.txt" zustande? Wenn Du die immer komplett selbst schreibst und der Besucher von außen KEINERLEI Einfluss darauf hat, dann bist Du aus dem Schneider.
Wenn allerdings die Datei dynamisch erzeugt wird von einem Script und der Besucher Einfluss auf diesen Erzeugungsprozess hat, dann führt das dazu, das jemand - wenn Du beim Erzeugungsprozess nicht aufpasst - unter Umständen doch PHP-Code bei Dir ausführen kann. Stell Dir vor, jemand schafft es, in die 'textdatei.txt' einfach ein <?php boese_funktion (); ?> einzufügen - dann wird das durch das Einbinden per include ausgeführt und Du hast ein Problem.
Das korrekte Verhalten in dem Fall wäre, wenn Du natürlich dafür sorgst, dass das Script, das Benutzerdaten entgegen nimmt und die Datei erzeugt, dafür sorgt, dass so ein Inhalt nicht in die Datei kommen kann.
Da man teilweise (v.a. als Anfänger) sowas schwer sehen kann, kann man aber das Risiko eines derartigen Angriffs minimieren, indem man readfile() statt include verwendet. include benötigt man nur, wenn in der Datei auch PHP-Code stehen soll - wenn dies NICHT der Fall ist, reicht ein einfaches
readfile ("/pfad/dateiname.txt");
Dann kann zumindest kein PHP-Code ausgeführt werden, wenn jemand es schafft, die Datei irgendwie zu manipulieren. Allerdings: Das ist dann nur die halbe Miete, weil dann natürlich jemand trotzdem noch beliebigen HTML- und JavaScript-Code einschleusen könnte. Insbesondere JavaScript könnte dann dazu genutzt werden, Daten anderer Kunden auszuspionieren oder zu manipulieren - das ganze nennt sich dann Cross Site Scripting. Daher ist readfile nur eine ZUSÄTZLICHE Sicherheitsmassnahme, um im Extremfall das Allerschlimmste zu vermeiden, allerdings beseitigt es das eigentliche Problem nicht.
Daher gilt auch bei readfile weiterhin: Sorge dafür, dass die Datei, die erzeugt wird, nur den Inhalt enthält, den sie enthalten soll und nichts anderes.
Wenn natürlich der Inhalt der Datei komplett von Dir erzeugt wird und von keinem Script bearbeitet wird, dann brauchst Du Dir keine Sorgen zu machen, dass dabei etwas passiert. Ich wollte hier an der Stelle jedoch generell mal etwas zum Thema schreiben, denn oft wird nicht bedacht, dass selbst ein vermeintlich "sicheres" include unter Umständen gar nicht sicher ist.
Viele Grüße,
Christian
Hallo,
vielen Dank für Antworten, das war sehr aufschlussreich!
Die Textdateien werden nur von mir erstellt, bearbeitet und via FTP hochgeladen, dennoch werde ich den Tipp von Christian Seiler beherzigen, den ich bis dato noch nicht kannte.
Im übrigen finde ich es sehr bemerkenswert, so eine ausführliche und hilfreiche Antwort zu bekommen.
Vielen Dank also für die Antworten und meinen besonderen Dank an Christian Seiler für die so ausführliche Hilfestellung!
Gruß
Saanve