PHP-beveiliging uitgelegd · defensief
XSS in PHP: wat het is en hoe je het voorkomt
Cross-site scripting is nog steeds een van de meest voorkomende webfouten. In PHP komt het meestal neer op data in HTML zetten zonder die te escapen voor de plek waar ze terechtkomt.
Laatst bijgewerkt
Wat het is
Reflected XSS geeft een waarde uit het huidige verzoek terug; stored XSS slaat die op, bijvoorbeeld in een reactie, en toont hem aan iedereen; DOM-based XSS gebeurt in JavaScript aan de clientkant. In alle gevallen voert de browser script uit met de rechten van je site, wat sessies kan stelen of namens de gebruiker kan handelen. MITRE noemt dit CWE-79.
Zo vind je het
- Zoek in templates en PHP-bestanden naar
echo,printen<?=die variabelen uitvoeren zonderhtmlspecialchars()of een templatefilter. - Let extra op waarden in HTML-attributen, inline JavaScript, URL’s en CSS, waar HTML-escaping alleen niet volstaat.
- Gebruik de beveiligingscontroles van je framework en een scanner als OWASP ZAP op een eigen stagingkopie.
Zo los je het op
- Escape bij uitvoer:
htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')voor HTML-tekst en attributen tussen aanhalingstekens. - Gebruik een template-engine met auto-escaping aan (Twig, Blade, Latte) en geen raw-filters voor onbetrouwbare data.
- Gebruik
json_encode()metJSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOTvoor data in scriptblokken en valideer URL’s voordat ze in href komen. - Voeg een Content-Security-Policy toe en zet sessiecookies op HttpOnly, Secure en SameSite.
Alleen-lezen controles en veilige patronen
# 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'Kan ik niet beter tags uit de invoer halen?
Invoer filteren helpt, maar wat XSS betrouwbaar voorkomt is escapen bij uitvoer voor de juiste context. OWASP raadt eerst output-encoding aan.
Voorkomt strip_tags() XSS?
Niet betrouwbaar. Het dekt attribuut- en JavaScript-contexten niet af en wordt makkelijk verkeerd gebruikt.
Andere PHP-kwetsbaarheidsklassen
- PHP object injection: wat het is en hoe je het oplostPHP object injection ontstaat wanneer door gebruikers beïnvloedbare invoer unserialize() bereikt, dat objecten kan aanmaken waarvan de magische methoden door de aanvaller gekozen logica uitvoeren.
- PHP file inclusion (LFI/RFI): wat het is en hoe je het oplostFile inclusion ontstaat wanneer gebruikersinvoer het pad voor include of require bepaalt, waardoor een aanvaller lokale bestanden leest (LFI) of, met allow_url_include aan, externe code uitvoert (RFI).
- SSRF in PHP: wat het is en hoe je het oplostServer-side request forgery (SSRF) ontstaat wanneer een PHP-app een door de gebruiker bepaalde URL ophaalt, waardoor een aanvaller via je server interne diensten of cloudmetadata-endpoints bereikt.
- phpinfo()-blootstelling: waarom het telt en hoe je het oplostEen openbare phpinfo()-pagina verraadt de exacte PHP-versie, geladen modules, bestandspaden en vaak omgevingsvariabelen of geheimen, wat aanvallers helpt fouten als PHP2Shell gericht te misbruiken.
Bronnen
Externe links verlaten deze site. Wij hosten geen exploitcode.
- CWE-79: Cross-site Scripting — MITRE CWE
- Cross Site Scripting Prevention Cheat Sheet — OWASP Cheat Sheet Series
- htmlspecialchars() — PHP Manual