Cross-Posting als konsolidierte Referenz aus der SO-Dokumentation Beta, die offline geschaltet wird.
Problem
Cross-Site-Scripting ist die unbeabsichtigte Ausführung von Remotecode durch einen Webclient. Jede Webanwendung kann sich XSS aussetzen, wenn sie Eingaben von einem Benutzer entgegennimmt und diese direkt auf einer Webseite ausgibt. Wenn die Eingabe HTML oder JavaScript enthält, kann Remotecode ausgeführt werden, wenn dieser Inhalt vom Webclient gerendert wird.
Wenn beispielsweise eine Seite eines Drittanbieters eine JavaScript-Datei enthält:
// http://example.com/runme.js
document.write("I'm running");
Und eine PHP-Anwendung gibt direkt eine übergebene Zeichenfolge aus:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Wenn ein nicht aktivierter GET-Parameter enthält, <script src="http://example.com/runme.js"></script>
lautet die Ausgabe des PHP-Skripts:
<div><script src="http://example.com/runme.js"></script></div>
Das JavaScript eines Drittanbieters wird ausgeführt und der Benutzer sieht auf der Webseite "Ich laufe".
Lösung
Vertrauen Sie in der Regel niemals den Eingaben eines Kunden. Jeder GET-, POST- und Cookie-Wert kann alles sein und sollte daher validiert werden. Wenn Sie einen dieser Werte ausgeben, maskieren Sie diese, damit sie nicht auf unerwartete Weise ausgewertet werden.
Beachten Sie, dass selbst in den einfachsten Anwendungen Daten verschoben werden können und es schwierig ist, alle Quellen im Auge zu behalten. Daher wird empfohlen, die Ausgabe immer zu umgehen.
PHP bietet je nach Kontext einige Möglichkeiten, der Ausgabe zu entgehen.
Filterfunktionen
PHPs Filterfunktionen erlauben die Eingabedaten an den PHP - Skript zu hygienisiert oder validiert in vielerlei Hinsicht . Sie sind nützlich beim Speichern oder Ausgeben von Client-Eingaben.
HTML-Codierung
htmlspecialchars
konvertiert alle "HTML-Sonderzeichen" in ihre HTML-Codierungen, was bedeutet, dass sie dann nicht als Standard-HTML verarbeitet werden. So beheben Sie unser vorheriges Beispiel mit dieser Methode:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Würde ausgeben:
<div><script src="http://example.com/runme.js"></script></div>
Alles innerhalb des <div>
Tags wird vom Browser nicht als JavaScript-Tag interpretiert, sondern als einfacher Textknoten. Der Benutzer wird sicher sehen:
<script src="http://example.com/runme.js"></script>
URL-Codierung
Bei der Ausgabe einer dynamisch generierten URL bietet PHP die urlencode
Funktion, gültige URLs sicher auszugeben. Wenn ein Benutzer beispielsweise Daten eingeben kann, die Teil eines anderen GET-Parameters werden:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Alle böswilligen Eingaben werden in einen verschlüsselten URL-Parameter konvertiert.
Verwendung spezialisierter externer Bibliotheken oder OWASP AntiSamy-Listen
Manchmal möchten Sie HTML oder andere Code-Eingaben senden. Sie müssen eine Liste autorisierter Wörter (weiße Liste) und nicht autorisierter Wörter (schwarze Liste) führen.
Sie können Standardlisten herunterladen, die auf der OWASP AntiSamy-Website verfügbar sind . Jede Liste ist für eine bestimmte Art von Interaktion geeignet (ebay api, tinyMCE usw.). Und es ist Open Source.
Es gibt Bibliotheken, um HTML zu filtern und XSS-Angriffe für den allgemeinen Fall zu verhindern und mindestens so gut wie AntiSamy-Listen mit sehr einfacher Verwendung auszuführen. Zum Beispiel haben Sie HTML Purifier