Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

XSS


Cosa è XSS

Cos’è XSS

XSS (Cross-Site Scripting) è una vulnerabilità che consente a un attaccante di iniettare codice JavaScript (o HTML) malevolo in una pagina web visualizzata da altri utenti.
Questo codice viene eseguito nel contesto del browser dell’utente, permettendo all’attaccante di rubare dati, come cookie e sessioni, o persino eseguire operazioni come se fosse l'utente.

Tipi di XSS

Esistono principalmente tre tipi di attacchi XSS:
1. XSS Riflessivo (Reflected XSS): Il codice malevolo è incorporato in una richiesta HTTP e "riflesso" nella risposta del server. L’attacco avviene solo se l’utente interagisce con un link o una form appositamente modificati.
2. XSS Persistente (Stored XSS): Il codice malevolo viene memorizzato nel database del server e servito a tutti gli utenti che visualizzano una pagina compromessa, aumentando il rischio per più utenti.
3. XSS Basato su DOM (DOM-based XSS): Questo tipo di attacco avviene lato client, quando il JavaScript del sito manipola il DOM in modo non sicuro, permettendo l’inserimento di codice malevolo che viene eseguito nel browser dell'utente senza coinvolgere il server.

Difendersi da XSS in PHP

Per prevenire gli attacchi XSS in PHP, ci sono alcune tecniche principali:

Sanificazione dell’input con `htmlspecialchars()`

Questa funzione converte i caratteri speciali in entità HTML, impedendo l’esecuzione di codice JavaScript.

   $input = htmlspecialchars($_GET['input'], ENT_QUOTES, 'UTF-8');

Convalida e sanificazione

con `filter_input` e `filter_var()`:** Queste funzioni aiutano a rimuovere contenuti pericolosi.

   $input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_STRING);


Escape dell’output HTML

Quando mostri del testo proveniente dall'utente, usa sempre `htmlspecialchars()` o `htmlentities()`.

   echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');


Escape per JavaScript

Per evitare iniezioni in contesti JavaScript, usa `json_encode()` per convertire il valore in una stringa JSON sicura.

   echo '<script>var userInput = ' . json_encode($userInput) . ';';

Content Security Policy (CSP)

Una Content Security Policy può limitare le fonti da cui caricare script, riducendo i rischi di esecuzione di codice non sicuro.

   header("Content-Security-Policy: default-src 'self'");

### Difendersi da XSS in JavaScript Anche in JavaScript è possibile implementare alcune misure di sicurezza:

Escape dell’output per HTML

JavaScript e URL: Se inserisci input utente direttamente nel DOM, effettua sempre l’escape appropriato:
Per HTML: usa `textContent` invece di `innerHTML` per inserire solo testo senza interpretare HTML.
   
   document.getElementById("output").textContent = userInput;
   
   

Utilizzare librerie di sanificazione

Puoi usare librerie come DOMPurify per sanificare i dati HTML che devono essere mostrati in modo sicuro.

   const sanitizedHTML = DOMPurify.sanitize(userInput);
   document.getElementById("output").innerHTML = sanitizedHTML;


Avoid `eval()` e `innerHTML`

L’uso di `eval()` e `innerHTML` con dati non sanificati è molto rischioso e può consentire esecuzione di codice malevolo.

Content Security Policy (CSP)

Impostare una CSP a livello di applicazione è fondamentale anche per limitare l’esecuzione di JavaScript non autorizzato:

   // Aggiungere header CSP lato server per ridurre i rischi di esecuzione di script non sicuri.


Escape in contesti URL

Evitare l’inserimento diretto di dati non sanificati in URL; utilizzare `encodeURIComponent` per costruire URL in modo sicuro.

   const safeURL = "https://example.com/search?query=" + encodeURIComponent(userInput);


Riepilogo


Per evitare attacchi XSS, è importante: - In PHP: usare `htmlspecialchars()`, `filter_input()`, `json_encode()` e impostare una CSP.
- In JavaScript: evitare `innerHTML` con input non sanificato, usare `textContent` e `DOMPurify` per la sanificazione.
Queste best practice proteggono efficacemente dalle vulnerabilità XSS nelle applicazioni PHP e JavaScript.