XSS (Cross-Site Scripting, zu Deutsch “Seitenübergreifendes Skripting”) ist eine Sicherheitslücke in Webanwendungen, die es Angreifern ermöglicht, schädlichen JavaScript-Code in Webseiten einzuschleusen, die von anderen Benutzern angesehen werden. Diese Schwäche entsteht häufig dadurch, dass Daten von Benutzern ohne ausreichende Validierung oder Filterung in Webseiten eingebunden werden. Dadurch können Angreifer beispielsweise Cookies stehlen, Sitzungen übernehmen, Eingabefelder manipulieren oder schädliche Inhalte anzeigen.
Es gibt drei Haupttypen von XSS-Angriffen:
1. Reflektiertes XSS (Reflected XSS): Hierbei wird der schädliche Code als Teil einer HTTP-Anfrage an die Webanwendung gesendet und direkt im HTML der Antwort reflektiert. Dies passiert oft über URL-Parameter.
2. Gespeichertes XSS (Stored XSS): Der schädliche Code wird dauerhaft auf dem Server gespeichert (z. B. in einer Datenbank) und bei Aufruf der betroffenen Seite an alle Benutzer ausgeliefert.
3. DOM-basiertes XSS (DOM-based XSS): Der Angriff erfolgt vollständig auf der Client-Seite innerhalb des Document Object Model (DOM) der Webseite, ohne dass der Server davon betroffen wird.
Um XSS in PHP zu verhindern, gibt es verschiedene Techniken und bewährte Methoden:
1. Eingaben validieren und bereinigen: Alle Benutzereingaben sollten strikt validiert und bereinigt werden. Es ist ratsam, nur die erwarteten Datenformate zu erlauben.
```php function validate_input($data) { // Beispiel einer einfachen Validierung $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ```2. Benutzereingaben escapen: Insbesondere bevor die Eingaben in das HTML eingefügt werden. Die `htmlspecialchars`-Funktion in PHP ist nützlich, um Sonderzeichen in HTML-Entitäten umzuwandeln.
```php $safe_variable = htmlspecialchars($user_input, ENT_QUOTES, ‘UTF-8’); ```3. Content Security Policy (CSP) festlegen: Eine starke CSP kann helfen, das Laden von nicht vertrauenswürdigen Skripten zu verhindern.
```html ```4. Bibliotheken und Frameworks verwenden: Es gibt viele moderne PHP-Frameworks, die eingebaute Sicherheitsfunktionen zur Verhinderung von XSS mitbringen. Beispiele sind Laravel oder Symfony.
Beispiele aus der Praxis umfassen die Behandlung von Benutzernamen oder Kommentaren auf einer Webseite:
```php
// Anfragen validieren und bereinigen
$username = validate_input($_POST[‘username’]);
$comment = validate_input($_POST[‘comment’]);
// Prepared Statements für sichere Datenbankabfragen verwenden
$stmt = $pdo->prepare(“INSERT INTO comments (username, comment) VALUES (:username, :comment)”);
$stmt->execute([‘username’ => $username, ‘comment’ => $comment]);
// Ausgabe im HTML kontextuell escapen
echo “
” . htmlspecialchars($username, ENT_QUOTES, ‘UTF-8’) . “: “ . htmlspecialchars($comment, ENT_QUOTES, ‘UTF-8’) . “
”;Quellen:
1. C. K. Chow, “Cross Site Scripting (XSS) Attacks and Defense Mechanisms: classification and state-of-the-art”, International Journal of Information Security Science, 2012.
2. OWASP Foundation, “Cross-Site Scripting (XSS)”, OWASP. Abgerufen am 10. Dezember 2020. Verfügbar auf: https://owasp.org/www-community/attacks/xss/
3. PHP Documentation, “htmlspecialchars”, php.net. Verfügbar auf: https://www.php.net/manual/en/function.htmlspecialchars.php