Wenn ein Besucher Text auf Ihre Seite bringen kann, den andere Besucher sehen, und dieser Text nicht maskiert wird, kann er stattdessen ein Skript hineinsetzen. Es läuft als Ihre Website, mit der Sitzung Ihres Besuchers, und kann alles, was dieser Besucher kann.
Woher es kommt
- Ein Kommentar, ein Name, eine Bewertung - alles, was der eine tippt und dem anderen gezeigt wird.
- Ein URL-Parameter, der zurück auf die Seite gedruckt wird - also das Suchfeld auf fast jeder Website.
- Der Name einer hochgeladenen Datei.
- Daten aus einer API, die Ihnen nicht gehört.
Die Gewohnheit
Maskieren Sie bei der AUSGABE, jedes Mal, im jeweiligen Kontext, in den Sie schreiben. Nicht bei der Eingabe - dieselben Daten landen vielleicht in HTML, in einem Attribut und in JavaScript, und jedes verlangt eine andere Maskierung.
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
- In HTML-Text - htmlspecialchars mit ENT_QUOTES.
- In einem Attribut - dasselbe, und setzen Sie das Attribut immer in Anführungszeichen.
- In JavaScript - json_encode, niemals Zeichenketten aneinanderhängen.
- In einer URL - urlencode.
Eine zweite Schicht
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
CSP weist den Browser an, Skripte nur von Ihrem eigenen Ursprung auszuführen, sodass ein eingeschleustes Inline-Skript selbst dann nicht läuft, wenn eines durchkommt. Führen Sie sie zuerst im Report-only-Modus ein, sonst zerlegen Sie Ihre eigene Seite.
Prüfen Sie es
Setzen Sie in jedes Feld eine harmlose Markierung und schauen Sie sich den QUELLTEXT der Seite an, die sie anzeigt. Die Markierung als Text zu sehen ist richtig; sie als Tag zu sehen ist der Fehler.
