Pubblicazione incrociata di questo come riferimento consolidato dalla beta della documentazione SO che non è in linea.
Problema
Lo scripting tra siti è l'esecuzione involontaria di codice remoto da parte di un client Web. Qualsiasi applicazione Web potrebbe esporsi a XSS se accetta input da un utente e lo emette direttamente su una pagina Web. Se l'input include HTML o JavaScript, il codice remoto può essere eseguito quando questo contenuto viene renderizzato dal client Web.
Ad esempio, se un lato di terze parti contiene un file JavaScript:
// http://example.com/runme.js
document.write("I'm running");
E un'applicazione PHP genera direttamente una stringa passata al suo interno:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Se un parametro GET non selezionato contiene, <script src="http://example.com/runme.js"></script>
l'output dello script PHP sarà:
<div><script src="http://example.com/runme.js"></script></div>
Verrà eseguito JavaScript di terze parti e l'utente vedrà "Sono in esecuzione" sulla pagina Web.
Soluzione
Come regola generale, non fidarsi mai dell'input proveniente da un client. Ogni valore GET, POST e cookie potrebbe essere qualsiasi cosa e dovrebbe pertanto essere convalidato. Quando si emette uno di questi valori, sfuggirli in modo che non vengano valutati in modo imprevisto.
Tieni presente che anche nelle applicazioni più semplici i dati possono essere spostati e sarà difficile tenere traccia di tutte le fonti. Pertanto è consigliabile evitare sempre l' output.
PHP offre alcuni modi per sfuggire all'output a seconda del contesto.
Funzioni di filtro
Le funzioni del filtro PHP consentono di disinfettare o convalidare i dati di input nello script php in molti modi . Sono utili durante il salvataggio o l'output dell'input del client.
Codifica HTML
htmlspecialchars
convertirà i "caratteri speciali HTML" nelle loro codifiche HTML, il che significa che non verranno elaborati come HTML standard. Per correggere il nostro esempio precedente usando questo metodo:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Uscita:
<div><script src="http://example.com/runme.js"></script></div>
Tutto all'interno del <div>
tag non verrà interpretato come un tag JavaScript dal browser, ma come un semplice nodo di testo. L'utente vedrà in sicurezza:
<script src="http://example.com/runme.js"></script>
Codifica URL
Quando si genera un URL generato dinamicamente, PHP fornisce la urlencode
funzione per generare in modo sicuro URL validi. Ad esempio, se un utente è in grado di inserire dati che diventano parte di un altro parametro GET:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Qualsiasi input dannoso verrà convertito in un parametro URL codificato.
Utilizzo di librerie esterne specializzate o elenchi OWASP AntiSamy
A volte vorrai inviare HTML o altri tipi di input di codice. Dovrai mantenere un elenco di parole autorizzate (lista bianca) e non autorizzate (lista nera).
È possibile scaricare elenchi standard disponibili sul sito Web di OWASP AntiSamy . Ogni elenco è adatto per un tipo specifico di interazione (ebay api, tinyMCE, ecc ...). Ed è open source.
Esistono librerie esistenti per filtrare l'HTML e prevenire gli attacchi XSS per il caso generale e che eseguono almeno elenchi AntiSamy con un utilizzo molto semplice. Ad esempio hai HTML Purifier