Vinzenz Mai: Des Kaisers neue Kleider, Fortsetzung

Beitrag lesen

Hallo,

Wenn der Nutzer HTML-Code eingeben will, dann lass' ihn. Aber sorge dafür, dass dieser nicht als HTML *interpretiert*, sondern nur als Text dargestellt wird.

Nutze htmlspecialchars, und lasse auch die Anführungszeichen und/oder Hochkommata behandeln - sonst lässt sich JavaScript-Code bspw. an Stellen einschleusen, an denen aus den Nutzereingaben Attributwerte erzeugt werden.

zur Ergänzung
@@cygnus: Möchtest Du doch etwas HTML-Formatierung zulassen, so wäre BB-Code eine gute Idee. Für BB-Code-Behandlung gibt es sogar fertige Klassen.

Fortführung eines Märchens:

Es war einmal ein Kaiser, der sich einen programmierbaren Overall hatte anfertigen lassen. Schnell merkte der Kaiser, dass ein einziger Overall nicht in allen Lebenslagen das geeignete Kleidungsstück war - obwohl er über ein Ersatzexemplar verfügte. Darin zu schlafen, machte keinen Spass - deswegen liess er sich einen Schlafanzug fertigen. Zum Schwimmen im hauseigenen Swimmingpool oder dem öffentlichen Schwimmbad war der Overall auch nicht praktisch, dafür wurden mal Badehosen erfunden. Fürs Reiten gab's einen Reitanzug, für den Kampf eine Rüstung mit Waffen, für die Jagd ein Mittelding aus beidem).

Was lernen wir daraus? Daten (am besten Rohdaten, d.h. der nackte Kaiser) müssen jeweils gemäß dem Kontext behandelt (gekleidet) werden, in den sie gebracht werden:

In einem normalen HTML-Kontext reicht es, diese Daten mit htmlspecialchars() zu behandeln. Ist es jedoch im Kontext eines Attributes (zum Beispiel dem value-Attribut eines Input-Elementes), dann musst Du noch auf Anführungszeichen achten.

Kommen die Daten in einen Javascript-Kontext, so müssen sie gemäß Javascript-Kontext behandelt werden. Befindet sich dieser Javascript-Kontext in einem HTML-Kontext, so ziehst Du dem Kaiser zuerst Unterwäsche an (behandelst ihn für den Javascript-Kontext) und erst danach die Oberbekleidung, d.h. Du behandelst die für den Javascript-Kontext aufbereiteten Daten für den HTML-Kontext ... und nicht etwa umgekehrt.

PHP hat ein gut gemeintes (das heißt schlecht gemachtes) Feature namens Magic Quotes. Dies geht davon aus, dass der Kaiser grundsätzlich auf Eisbärenjagd gehen will (die Daten in eine MySQL-Datenbank speichern will) und stattet daher den Kaiser grundsätzlich mit einer dafür (einigermaßen, aber nicht ganz) passenden Ausrüstung aus. Nun kannst Du Dir sicher vorstellen, dass der Kaiser nicht jeden Tag auf Eisbärenjagd gehen will. Deswegen ist es eine gute Idee, in einem solchen Fall diese Spezialausstattung zuallererst abzulegen (Magic Quotes deaktivieren), damit der Kaiser stets die Kleidung anziehen kann, die zur geplanten Aktivität (dem Kontext) exakt passt.

Freundliche Grüße

Vinzenz