Sicherheit für kleines CMS

nchristoph

Erfahrenes Mitglied
Hallo,

ich arbeite gerade Übungsweise an einem kleinen CMS.

Ich hab da eine kleine Sicherheitstechnische Frage:

Ich gebe den Content so aus:

PHP:
echo stripslashes(nl2br($row['b_content']));

Jetzt werden aber alle HTML Tags bei der Eingabe gelöscht:

PHP:
$text = htmlentities(strip_tags(mysql_real_escape_string($_POST['text'])));

Dadurch kann ich den Text nicht formatieren.

Wie kann ich das jetzt absichern und trotzdem den Text schön formatieren?

Vielen Dank im voraus.

Grüsse
 
Hi,

Mein Grundsatz ist: Alles kommt in die Datenbank, möglichst genau so wie ein Benutzer die Daten vorgelegt hat. Erst bei der Ausgabe wird gefiltert und eventuell angepasst. Also reines mysql-Escaping, keine HTML-Tags oder so löschen.

Wenn es ein CMS ist, bei dem die Seiten nur durch den Betreiber oder einer berechntigten Person geändert werden können, dann würde ich die Tags nicht rausstreichen. Nur bei Eingaben / Ausgaben, die von normalen Benutzern geändert werden können, würde ich die Filterung einbauen.

Eine Alternative dazu, wenn du die Tags wirklich löschen willst, wäre BBCode, ähnlich wie hier im Forum oder Wikicode wie auf Wikipedia. Allerdings schränkst du somit die Anpassbarkeit deiner CMS-Seiten sehr stark ein.

Gruß,
BK
 
Es ist halt ein Übungscms, wo ich genau auf solche Sachen draufkommen will.

Ich hab zwar mittlerweile ein, für mich zumindest, sehr grosses PHP Wissen, was ich auch zu einem grossen Teil den Leuten auf tutorials.de zu verdanken habe(*Schleimmodus aus*:P), mir fehlen allerdings die 'Eier' es auch anzuwenden weil ich mir einfach nicht sicher bin, ob der Code so wie ich ihn schreibe richtig, sicher und performant ist.

Danke für die Antwort, ich werds gleich mal umsetzten.

Kurze OT Frage: Welchen WSIWYG Editor würdest du empfehlen? Ich hab imo TinyMCE im Auge, aber kann ich den auch verwenden, wenn ich ein CMS zum DL anbiete oder muss ich da eine Lizenz kaufen?
 
Hi,

löblich dass du dich damit weiter beschäftigen willst und dass du das nicht im Alleingang probierst ;)

TinyCME steht unter der LGPL, das heißt du kannst den Source weitergeben, ja.

Hmm, mit WYSIWYG Editoren hab ich noch nicht viel Erfahrung, ich war mit dem CKEditor bisher aber recht zufrieden. Auf der Wikiseite stehen noch andere, kannst ja mal Vergleichen und deine Erfahrungen hier so mitteilen ;)

Gruß
BK
 
Ich kann dir TinyMCE sehr empfehlen! Da gibt es auch ein Plugin, das TinyMCE zu einem BBCode Editor werden lässt, wenn du was das angeht weiter machen willst.
 
So ich hab mich nach Intensiver Nachforschung für den TinyMCE entschieden, ist sehr einfach einzubinden und zu warten.

Andere Frage die wieder OnTopic ist:

Man soll ja das Verwenden von Requestvariablen bei Includes vermeiden.

Ich schätze mal, da zählt $_SERVER['DOCUMENT_ROOT'] auch dazu oder?

Wie könnte ich dann die Pfade für z.b. ein Theme System festlegen?
 
Hi,

was meinst du mit Requestsvariablen? Grundsätzlich $_GET und $_POST? Oder eher $_REQUEST?

Meiner Meinung nach ist es egal ob man diese für Includes hernimmt, solange man diese richtig filtert, zum Beispiel über eine Whitelist.

$_SERVER gehört da nicht dazu, weil die Felder vom Server festgelegt werden und manche vom Client somit nicht verändert werden können. Da gehört auch das DOCUMENT_ROOT dazu.

Gruß,
BK
 
Das heist, das ich über $_SERVER['DOCUMENT_ROOT'] ohne problem includen kann.

Danke für die Hilfe, ich melde mich nochmal, falls ich noch Fragen haben sollte.
 
Hallo!

Das heist, das ich über $_SERVER['DOCUMENT_ROOT'] ohne problem includen kann.
Kann man nicht pauschal sagen.
Es hängt halt auch davon ab wie der Server konfiguriert ist.

Beispiel:
Auf einem meiner Linux-Server habe ich mod_userdir aktiviert.
Der User legt seine Webseiten daher in "/home/Benutzername/public_html" ab.
Die Seite wird dann mittels "http://hostname/~Benutzername" aufgerufen (in meinem Fall wird die Seite jedoch mittels vHost über "http://anderer-hostname" aufgerufen).
$_SERVER["DOCUMENT_ROOT"] hingegen verweist auf "/var/www/html" (hier liegen die Seiten die über "http://hostname" aufgerufen werden).
Da "/home/Benutzername/public_html" und "/var/www/html" jedoch zwei völlig verschiedene Verzeichnispfade sind, kann der User mit $_SERVER["DOCUMENT_ROOT"] nicht auf sein Verzeichnispfad verweisen.
Hier muss der User also tricksen.
Ich persönlich bevorzuge, da es sich am einfachsten merken lässt, den Verzeichnispfad in einer Variable anzulegen.

$_SERVER["DOCUMENT_ROOT"] kann also funktionieren, muss es aber nicht..... und ist deshalb mit einer gewissen Vorsicht anzuwenden.
Nicht zuletzt aus dem Grunde weil an der Serverkonfiguration ja auch jederzeit Veränderungen vorgenommen werden könnten (im schlimmsten Fall wird man darüber nichtmal informiert :p).

Gruss Dr Dau
 
Zurück