Geben Sie niemals irgendwelche Daten an den HTML-Stream aus, die nicht durch htmlspecialchars()
geleitet wurden und du bist fertig. Einfache Regel, leicht zu befolgen, schließt jedes XSS-Risiko vollständig aus.
Als Programmierer ist es dein Job, es zu tun, aber.
Sie können
definierenfunction h(s) { return htmlspecialchars(s); }
wenn htmlspecialchars()
ist zu lang, um 100 Mal pro PHP-Datei zu schreiben. Andererseits mit htmlentities()
ist überhaupt nicht nötig.
Der entscheidende Punkt ist:Es gibt Code und es gibt Daten. Wenn Sie die beiden vermischen, entstehen schlimme Dinge.
Im Fall von HTML besteht Code aus Elementen, Attributnamen, Entitäten und Kommentaren. Daten sind alles andere. Daten müssen maskiert werden, um nicht mit Code verwechselt zu werden.
Bei URLs ist Code das Schema, der Hostname, der Pfad, der Mechanismus der Abfragezeichenfolge (?
, &
, =
, #
). Daten sind alles in der Abfragezeichenfolge:Parameternamen und -werte. Sie müssen maskiert werden, um nicht mit Code verwechselt zu werden.
In HTML eingebettete URLs müssen doppelt maskiert werden (durch URL-Escapezeichen und HTML-Escape), um eine ordnungsgemäße Trennung von Code und Daten sicherzustellen.
Moderne Browser sind in der Lage, erstaunlich kaputtes und falsches Markup in etwas Nützliches zu parsen. Diese Fähigkeit sollte jedoch nicht betont werden. Die Tatsache, dass etwas funktioniert (wie URLs in <a href>
ohne ordnungsgemäßes HTML-Escapeing) bedeutet nicht, dass es gut oder richtig ist, dies zu tun. XSS ist ein Problem, das in a) Menschen wurzelt, die sich der Daten-/Code-Trennung nicht bewusst sind (d. h. "escaping") oder schlampig sind, und b) Menschen, die versuchen, schlau zu sein, welchen Teil der Daten sie nicht maskieren müssen.
XSS lässt sich leicht vermeiden, wenn Sie sicherstellen, dass Sie nicht in die Kategorien a) und b) fallen.