
Nel panorama della sicurezza informatica, il Cross-Site Scripting (XSS) è una delle vulnerabilità più comuni e pericolose che possono minare la sicurezza di un’applicazione web. Dopo aver esplorato il tema della SQL Injection nel primo articolo della nostra serie, ci concentriamo ora su XSS, esaminandone i rischi e le strategie per prevenirlo scrivendo codice sicuro in Java.
Che cos’è il Cross-Site Scripting (XSS)?
Il Cross-Site Scripting è una vulnerabilità che consente a un malintenzionato di iniettare codice malevolo (solitamente JavaScript) in una pagina web visualizzata da altri utenti. Questo codice viene eseguito nel contesto del browser della vittima, permettendo all’attaccante di:
- Rubare cookie, token di sessione e altre informazioni sensibili.
- Modificare dinamicamente il contenuto della pagina web.
- Reindirizzare la vittima a siti malevoli.
- Eseguire azioni dannose a nome della vittima.
Tipologie di XSS
- Stored XSS (Persistente): Il codice malevolo viene memorizzato sul server e consegnato a ogni utente che accede alla pagina.
- Reflected XSS: Il payload viene incluso nella risposta HTTP solo per l’utente che ha inviato la richiesta contenente il codice malevolo.
- DOM-Based XSS: Il codice viene iniettato direttamente nel DOM della pagina senza coinvolgere il server.
Potenziali rischi
Un attacco XSS può compromettere seriamente la sicurezza e l’integrità di un’applicazione. Tra le conseguenze più gravi troviamo:
- Violazione dei dati: Gli attaccanti possono sottrarre informazioni sensibili come credenziali e dati personali.
- Accesso non autorizzato: Gli attaccanti possono agire come utenti legittimi per compromettere ulteriormente il sistema.
Come scrivere codice sicuro in Java per prevenire XSS
La prevenzione del Cross-Site Scripting richiede una combinazione di sanitizzazione degli input, escaping dell’output e corretta configurazione delle applicazioni web. Vediamo alcune strategie pratiche con esempi di codice Java.
1. Sanitizzazione degli input
Sanitizzare gli input significa rimuovere o neutralizzare i caratteri potenzialmente pericolosi prima di utilizzarli. Ad esempio:
import org.apache.commons.text.StringEscapeUtils;
public String sanitizeInput(String userInput) {
return StringEscapeUtils.escapeHtml4(userInput);
}
Code language: JavaScript (javascript)
In questo esempio, utilizziamo la libreria Apache Commons Text per convertire i caratteri HTML pericolosi in entità sicure, come "<"
in "<"
.
2. Escaping dell’output
Per impedire l’esecuzione di codice iniettato, è essenziale eseguire l’escaping dei dati dinamici quando vengono inclusi in pagine HTML, JavaScript o attributi.
Esempio:
import org.owasp.encoder.Encode;
public String safeOutput(String userInput) {
return Encode.forHtml(userInput);
}
Code language: JavaScript (javascript)
La libreria OWASP Java Encoder è una scelta eccellente per l’escaping dell’output.
3. Validazione degli input
Un approccio preventivo consiste nel consentire solo input che rispettano un formato specifico:
import java.util.regex.Pattern;
public boolean isValidInput(String input) {
String regex = "^[a-zA-Z0-9 ]*$"; // Solo lettere, numeri e spazi
return Pattern.matches(regex, input);
}
Code language: JavaScript (javascript)
4. Content Security Policy (CSP)
Configurare una Content Security Policy è un’altra linea di difesa efficace. CSP è un header HTTP che impedisce l’esecuzione di codice non autorizzato.
Esempio di configurazione in Spring Boot:
import org.springframework.context.annotation.Bean;
import org.springframework.security.web.header.writers.ContentSecurityPolicyHeaderWriter;
import org.springframework.security.web.server.header.HttpHeadersWriter;
@Bean
public HttpHeadersWriter contentSecurityPolicy() {
return new ContentSecurityPolicyHeaderWriter("default-src 'self'; script-src 'self'");
}
Code language: JavaScript (javascript)
5. Uso di framework sicuri
Framework come Spring e Thymeleaf offrono meccanismi integrati per proteggere contro XSS. Ad esempio, Thymeleaf esegue automaticamente l’escaping degli input dinamici:
<p th:text="${userInput}"></p>
Code language: HTML, XML (xml)
In questo caso, userInput
verrà automaticamente escapato per prevenire XSS.
Conclusioni
Il Cross-Site Scripting è una minaccia seria per la sicurezza delle applicazioni web, ma è possibile prevenirlo adottando buone pratiche di programmazione. Sanitizzare gli input, eseguire l’escaping dell’output e configurare adeguatamente l’applicazione sono misure fondamentali.
Scrivere codice sicuro non è solo una responsabilità tecnica, ma anche un impegno verso gli utenti e la loro fiducia.
Nel prossimo articolo della serie, esploreremo un’altra vulnerabilità critica e come affrontarla nel contesto dello sviluppo Java.