PHP-Sicherheit erklärt · defensiv
XSS in PHP: was es ist und wie Sie es verhindern
Cross-Site Scripting ist weiterhin einer der häufigsten Web-Fehler. In PHP läuft es meist darauf hinaus, Daten ohne passendes Escaping in HTML auszugeben.
Zuletzt aktualisiert
Worum es geht
Reflektiertes XSS gibt einen Wert aus dem aktuellen Request zurück; gespeichertes XSS legt ihn ab, etwa in einem Kommentar, und liefert ihn allen aus; DOM-basiertes XSS passiert im clientseitigen JavaScript. In jedem Fall führt der Browser Skript mit den Rechten Ihrer Site aus, kann Sitzungen stehlen oder als Nutzer handeln. MITRE führt das als CWE-79.
So finden Sie es
- Suchen Sie in Templates und PHP-Dateien nach
echo,printund<?=, die Variablen ohnehtmlspecialchars()oder Template-Escape-Filter ausgeben. - Achten Sie besonders auf Werte in HTML-Attributen, Inline-JavaScript, URLs und CSS, wo HTML-Escaping allein nicht genügt.
- Nutzen Sie die Sicherheitsprüfungen Ihres Frameworks und einen Scanner wie OWASP ZAP gegen eine eigene Staging-Kopie.
So beheben Sie es
- Beim Ausgeben maskieren:
htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')für HTML-Text und Attribute in Anführungszeichen. - Nutzen Sie eine Template-Engine mit aktivem Auto-Escaping (Twig, Blade, Latte) und keine Raw-Filter für nicht vertrauenswürdige Daten.
- Nutzen Sie
json_encode()mitJSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOTfür Daten in Script-Blöcken und prüfen Sie URLs, bevor sie in href landen. - Ergänzen Sie eine Content-Security-Policy und setzen Sie Session-Cookies auf HttpOnly, Secure und SameSite.
Lesende Prüfungen und sichere Muster
# Find raw echo of request data (read-only, rough first pass)
grep -rnE "echo\s+\$_(GET|POST|REQUEST|COOKIE)" --include=*.php . | grep -v /vendor/
// Escape on output, for the HTML context
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
# Defense in depth: a Content-Security-Policy header (example)
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'Sollte ich stattdessen Tags aus der Eingabe entfernen?
Eingabefilter helfen, doch zuverlässig verhindert XSS das kontextgerechte Escaping bei der Ausgabe. OWASP empfiehlt zuerst Output-Encoding.
Verhindert strip_tags() XSS?
Nicht zuverlässig. Es deckt Attribut- und JavaScript-Kontexte nicht ab und wird leicht falsch genutzt.
Weitere PHP-Schwachstellenklassen
- PHP Object Injection: was es ist und wie Sie es behebenPHP Object Injection entsteht, wenn benutzerkontrollierte Eingaben unserialize() erreichen, das Objekte erzeugen kann, deren magische Methoden vom Angreifer gewählte Logik ausführen.
- PHP File Inclusion (LFI/RFI): was es ist und wie Sie es behebenFile Inclusion entsteht, wenn Benutzereingaben den Pfad für include oder require steuern; Angreifer lesen dann lokale Dateien (LFI) oder führen bei aktivem allow_url_include entfernten Code aus (RFI).
- SSRF in PHP: was es ist und wie Sie es behebenServer-Side Request Forgery (SSRF) entsteht, wenn eine PHP-App eine vom Benutzer gesteuerte URL abruft, sodass Angreifer über Ihren Server interne Dienste oder Cloud-Metadaten-Endpunkte erreichen.
- phpinfo()-Offenlegung: warum sie zählt und wie Sie sie behebenEine öffentliche phpinfo()-Seite verrät die genaue PHP-Version, geladene Module, Dateipfade und oft Umgebungsvariablen oder Geheimnisse, was Angreifern hilft, Fehler wie PHP2Shell gezielt auszunutzen.
Quellen
Externe Links verlassen diese Website. Wir hosten keinen Exploit-Code.
- CWE-79: Cross-site Scripting — MITRE CWE
- Cross Site Scripting Prevention Cheat Sheet — OWASP Cheat Sheet Series
- htmlspecialchars() — PHP Manual