Ein paar kleine CMS Updates…
Der Leser Kay hat ein paar Fehler in unserem CMS Quellcode entdeckt (Vielen Dank dafür). Diese wollen wir heute mal ausbessern.
Fangen wir mal an mit einer Sicherheitslücke. Kay hat diese in einem etwas älteren Artikel gefunden, wo der Code nun anders ist. Die Lücke tritt nun an einer andren Stelle auf. Direkt in der index.php im Root-Verzeichnis:
$currentpage->loadProperties($_GET[‚include‘]);
Wir greifen an einer anderen Stelle auf diese Variable direkt im Query zu. So besteht dort das Risiko zur SQL Injektion. Um dies zu verhindern, müssen wir einfach einmal mit dem mysql_real_escape_string darüber gehen:
$currentpage->loadProperties(mysql_real_escape_string($_GET[‚include‘]));
Ist nicht weiter schwer, oder?
So. Nun hat Kay noch rausgefunden, dass wenn kein include-Parameter übergeben wird (Also z.B. direkt der hier: http://cms.stevieswebsite.de ) oder ein falscher Parameter übergeben wird keine Seite geladen wird und es eventuell zu einem PHP-Fehler kommt.
Das ist jedoch nicht komplett falsch. Denn die Funktion filterfilename prüft vor dem include, ob die Datei vorhanden ist. Ist sie das nicht, wird die datei 404.php importiert (welche zur Zeit aber noch nicht existiert).
Direkt auf der Startseite wird jedoch auch die 404 angezeigt. Das muss noch abgefangen werden. Dazu schreiben wir in der Funktion filterfilename (/sys/filterfilename.php) noch eine kleine Überprüfung hinzu:
... $filename = preg_replace("/[^a-z0-9-/]/i","",$filename); if(trim($filename) == ""){ $filename = "home"; } if($filename[0] == "/"){ ...
Die Seiten 404.php und home.php erstellen wir dann beim nächsten mal.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Kommentare
erxxlu schrieb am 06.04.2010:
Nach dieser Änderung scheint es dennoch nicht zu funktionieren... wenn ich z.B. http://localhost/cms/ aufrufe womit dann kein Parameter übegeben wird, spuckt er bei mir als $filename: content/articles/.php aus...
Stefan Wienströer schrieb am 06.04.2010:
in der Funktion filterfilename?
erxxlu schrieb am 06.04.2010:
richtig, das liegt ja auch daran dass wir das als parameter übergeben inkl. der get variable die jedoch leer ist. deswegen ist der string nicht leer und der return wert ist deswegen auch nie "home" also müsste in der funktion filterfilename es wie folgt lauten: if(trim($filename) == "/content/articles/"){ $filename = "home"; } anstelle von if(trim($filename) == ""){ $filename = "home"; } da $filename nie leer ist.. in der page.php sehen wir dass wir immer das "../content/articles/" mit übergeben... function getContent(){ include(filterfilename("../content/articles/".$this->alias)); } Jedenfalls bekomme ich so beim aufruf von http://localhost/cms/ die Meldung dass die home.php fehlt... dies habe ich ermittelt in dem ich einfach $filename am ende ausgegeben habe und da erhalte ich dann halt home.php Ich hoffe dass ich mich jetzt da nicht total vertan habe ^^ Gruß
Stefan Wienströer schrieb am 07.04.2010:
Hast recht.
jULiM schrieb am 05.06.2011:
Hallo Stefan, habe noch etwas entdeckt: Muss es nicht heißen: $filename .= "home"; anstatt $filename = "home"; ??? Beim mir funktioniert es nur so! Super Tutorial und vielen Dank für die ganze geopferte Zeit!
jULiM schrieb am 07.06.2011:
Ok ich mach nen Rückzieher...;) Das war doch nicht die Lösung! Mir wurde daraufhin, sobald etwas nicht funktionierte, die Startseite als Fehlerseite angezeigt. :D Aber was mache ich bitte falsch? Die Testseiten funktionieren einwandfrei, aber die Startseite nicht...:( Würde mich wirklich sehr über Hilfe freuen!
Stefan Wienströer schrieb am 08.06.2011:
kannst du mal im filterfilename das Ergebnis ausgeben, und kurz posten, was er ausgibt?
jULiM schrieb am 08.06.2011:
Auf der Startseite erscheint (ohne Zugriff auf die 404-Seite) folgendes: Warning: include() [function.include]: Filename cannot be empty in /var/www/web639/html/projektarbeit/system/klassen/seite.php on line 25 Warning: include() [function.include]: Filename cannot be empty in /var/www/web639/html/projektarbeit/system/klassen/seite.php on line 25 Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/web639/html/projektarbeit/system/klassen/seite.php on line 25 Meine filterfilename.php sieht wie folgt aus:
Stefan Wienströer schrieb am 08.06.2011:
gib mal die Datei aus, die in seite.php included wird. Warum haben die Dateien bei dir denn deutsche Namen?^^
jULiM schrieb am 08.06.2011:
Ach Mist ich hab ganz vergessen, dass WP den Code löscht...:) Habs mal auf meinen Server gezogen: http://cms.indesign-meier.com/filterfilename.txt
jULiM schrieb am 08.06.2011:
Hab das ganze System in Deutsch geschrieben...:) http://cms.indesign-meier.com/system.txt
jULiM schrieb am 08.06.2011:
sry... habs falsch benannt... Der Inhalt ist trotzdem aus der Datei seite.php
jULiM schrieb am 08.06.2011:
Ich will nicht deine Kommentare zuspammen, aber ich hätte da noch ein "Augenschmankerl" für die CMS Einstellungen. Hast du ICQ?
Stefan Wienströer schrieb am 08.06.2011:
Hi, geht klar. Meine NUmmer ist 320-290-276. Werd aber gleich vermutlich nicht mehr online sein, müssen wir dann morgen machen.
andrej schrieb am 03.02.2012:
"Das muss noch abgefangen werden. Dazu schreiben wir in der Funktion filterfilename (/sys/filterfilename.php) noch eine kleine Überprüfung hinzu:" hier sollte es heissen: /system/filterfilename.php
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project