dedlfix: Order by Date funktioniert nicht ganz

Beitrag lesen

Tach!

Hattest Recht, war noch nicht alles sanitiert. Jetzt klappt alles. Aber das Problem lag nicht am Kontektwechsel.

Naja, du wirst sich ja wohl nicht selbst zu Google umgeleitet haben. So eine XSS-Injection (XSS=Cross side Scripting) besteht immer aus zwei Teilen, demjeningen der der eine Lücke ausnutzt und Texte eingibt, der als Code interpretiert werden kann, und demjenigen, der nicht beachtet hat, dass bestimmte Zeichen in bestimmten Kontexten eine Sonderbedeutung haben und zu maskieren sind, so dass sie lediglich als das Zeichen und nicht als Bestandteil von Code interpretiert werden.

Wenn ich in einem A-Tag einen Link habe wie diesen hier:

<a href="<?php echo $row['id']; ?>">Link</a>

Muss ich da ebenso htmlspecialchars anwenden oder eher filter_var($row['id'], FILTER_SANITIZE_NUMBER_INT) ?

Filtern ist eher dazu geeignet, ungewünschte Werte aus fachlichen Gründen zu entfernen. Filtern am Eingang um sicherheitstechnisch vorzubeugen halte ich für keine gute Idee, denn die Ausgabe von Daten muss zum Ausgabekontext passen, und das gilt für alle Daten, nicht nur für Nutzereingaben. Zudem gehen die Nutzerdaten oft verschlungene Wege und wenn man für alle möglichen Szenarien vorsorgen möchte, bleibt am Ende von den eigentlichen Daten nicht mehr viel übrig, oder sie sind hoffnungslos vermaskiert und damit auch kaputt.

Nun zum konkreten Fall. Im Allgemeinen hat man bei einem Konstrukt wie dem obigen zwei geschachtelte Kontexte. Zum einen sind da die Daten, die in die URL eingefügt werden, wofür diese URL-gerecht behandelt werden müssen. Zum anderen fügst du dann diese URL in den HTML-Kontext ein, wofür die Regeln von HTML Anwendung finden müssen, um ein syntaktisch korrektes Ergebnis zu erzielen.

Bei Daten in URLs muss man etwas aufpassen, denn einige Zeichen müssen erhalten bleiben, wie /, wenn sie Pfadbestandteile trennen sollen. Die URL-Kodierung darf also nur auf die eingefügten Daten, nicht aber auf die gesamte URL erfolgen. Die HTML-Kodierung für das Einfügen ins a-href-Attribut muss hingegen für den gesamten Attributwert, sprich die komplette URL erfolgen.

$row['id'] klingt nach Datenbank als Quelle. Wenn das Feld vom Typ INT oder vergleichbar ist, dann können da nur Ziffern herkommen und die sind hier ungefährlich. Trotzdem würde ich hier das htmlspecialchars() nicht weglassen, schon um dem Leser zu zeigen, dass man diese Stelle nicht übersehen hat. Dass da nur Zahlen ankommen ist ja nicht direkt offensichtlich, sondern erst nachdem man sich den Feldtyp angeschaut hat. Alternativ kann bei Integerwerten auch intval() genommen werden, das stellt ebenfalls sicher, dass nur Zahlen durchkommen. Beide Möglichkeiten sind auch noch kürzer und einfacher zu notieren als der Aufruf von filter_var().

Was mir aber seltsam erscheint: der Link soll lediglich eine ID sein? Also, technisch möglich wäre das und es gibt sicher auch sinnvolle Anwendungsfälle, es sieht nur recht ungewöhnlich aus.

dedlfix.