Cross-Site Scripting (XSS) è una vulnerabilità in cui un attaccante inietta JavaScript malevolo in una pagina web visualizzata da altri utenti — eseguito nei loro browser per rubare dati, dirottare sessioni o eseguire azioni al loro posto. È una vulnerabilità web comune e pericolosa, prevenibile con la corretta gestione dell'output.
Come funziona XSS
When user input is rendered into a page WITHOUT proper escaping, injected SCRIPTS run:
<!-- ❌ VULNERABLE — user input rendered directly into HTML -->
<div>Welcome, <%= userInput %></div>
<!-- attacker submits: <script>stealCookies()</script> -->
<!-- → the script RUNS in other users' browsers (in the site's context) -->
Lo script iniettato viene eseguito nei browser delle vittime come se provenisse dal sito affidabile — consentendo agli attaccanti di rubare cookie/token di sessione, dirottare account, catturare sequenze di tasti o eseguire azioni come l'utente.
Tipi di XSS
STORED → malicious script SAVED on the server (e.g. in a comment) → served to all viewers
REFLECTED → script in a request (e.g. a URL parameter) reflected back in the response
DOM-based → client-side JS unsafely puts untrusted data into the DOM
Prevenzione
✓ ESCAPE/ENCODE output → render user data as TEXT, not HTML (the key defense):
→ frameworks (React, Angular, Vue) auto-escape by default → use them properly
→ escape based on context (HTML, attribute, JS, URL)
✓ AVOID dangerous APIs → innerHTML, dangerouslySetInnerHTML, eval with untrusted data
✓ SANITIZE HTML if you must allow it (e.g. DOMPurify for rich text)
✓ Content Security Policy (CSP) → restricts what scripts can run (defense in depth)
✓ HttpOnly cookies → JS can't read them (limits cookie theft via XSS)
Perché è importante
Comprendere XSS e come prevenirlo è essenziale perché è una vulnerabilità web comune e pericolosa che consente agli attaccanti di eseguire script malevoli nei browser degli utenti, quindi è una conoscenza di sicurezza imprescindibile per gli sviluppatori web.
Comprendere come funziona — che il rendering dell'input dell'utente in una pagina senza il corretto escaping consente al JavaScript iniettato di eseguirsi nei browser di altri utenti nel contesto del sito affidabile, permettendo agli attaccanti di rubare cookie e token di sessione, dirottare account e agire come l'utente — è necessario per riconoscere e prevenire la vulnerabilità.
XSS è pericoloso perché compromette le sessioni e i dati degli utenti, ed è comune nelle app web che visualizzano contenuti generati dagli utenti.
Comprendere i tipi (stored XSS — script malevoli salvati sul server e forniti a tutti i visualizzatori, il più pericoloso; reflected XSS — script riflessi da una richiesta; DOM-based XSS — manipolazione DOM lato client non sicura) aiuta a riconoscere i diversi vettori di attacco.
Comprendere la prevenzione è essenziale: escaping/encoding dell'output (rendering dei dati utente come testo, non HTML — la difesa chiave, che i framework moderni come React fanno automaticamente per impostazione predefinita quando usati correttamente), evitare API pericolose (innerHTML, dangerouslySetInnerHTML, eval con dati non attendibili — fonti comuni di XSS), sanitizzare HTML quando deve essere consentito contenuto ricco (ad es. DOMPurify), Content Security Policy (limitare l'esecuzione di script come difesa in profondità) e cookie HttpOnly (prevenire che JS li legga).
Comprendere che i framework auto-escaping (quindi usarli correttamente previene la maggior parte di XSS, mentre bypassare il loro escaping lo reintroduce) è praticamente importante.
Poiché XSS è una vulnerabilità comune e pericolosa che compromette le sessioni e i dati degli utenti, specialmente nelle app che visualizzano contenuti degli utenti, e poiché comprendere come funziona e come prevenirlo (escaping dell'output, evitare API pericolose, CSP, impostazioni predefinite del framework) è essenziale per gli sviluppatori web, comprendere XSS e la sua prevenzione è una conoscenza di sicurezza essenziale e imprescindibile — una vulnerabilità web fondamentale da difendere, dove la corretta gestione dell'output (escaping, utilizzo delle impostazioni predefinite del framework, evitare API pericolose) è una conoscenza critica per proteggere gli utenti da una classe diffusa di attacchi.
