I caratteri sono un modo efficace per prevenire l'XSS?

12

Immagino che la codifica HTML dell'input sia probabilmente una soluzione migliore, ma sono curioso che se solo togliere% qualsiasi < e > caratteri sia una difesa efficace contro gli attacchi XSS.

In questo modo mantenere un sito sicuro contro XSS?

AGGIORNAMENTO: se non mi proteggerà qualcuno potrebbe spiegare che tipo di attacco potrebbe attraversare?

    
posta Abe Miessler 30.04.2013 - 00:07
fonte

3 risposte

13

Dipende dal contesto in cui avviene l'iniezione.

Ovviamente, se l'iniezione avviene nel contesto di un contenuto di elementi come questo:

<p>Your search for "❌" has returned the following results:</p>

< è richiesto per passare dal testo al markup. Ma anche qui, se echi l'input dell'utente in <script> , ad esempio:

<script>var search = "❌";</script>

Avrai bisogno di cercare altri personaggi come non sei nel contesto del testo normale. Qui dovresti fare attenzione ai caratteri che sono speciali all'interno di stringhe di stringhe JavaScript così come certe sequenze che possono denotare il script tag finale dell'elemento , ad es </script> o </script/ .

Allo stesso modo, se si stampa l'input dell'utente nel valore dell'attributo di un elemento:

<input type="text" name="search" value="❌">

Qui devi occuparti dei personaggi speciali per i doppi valori citati valori degli attributi , ovvero la citazione delimitando " . Se utilizzi virgolette singole o nessuna virgolette, è necessario applicare regole diverse.

Inoltre, non devi solo cercare la sintassi ma anche la semantica. Come se esistessero gli% URI dijavascript: e% co_de che possono essere usati per XSS. Oppure c'è un JavaScript che usa parte dei dati forniti dall'utente per una valutazione, o il recupero di qualche altro codice di script, ecc. Ci sono centinaia di esempi .

Quindi sempre prendi in considerazione il contesto in cui vuoi mettere i dati forniti dall'utente e codifica i dati in modo corrispondente.

    
risposta data 30.04.2013 - 07:59
fonte
6

Risposta breve: No.

Risposta lunga: in molti casi, sì, ma non farlo.

Qualcuno mi corregga se ho torto su qualcosa qui.

Se , e solo se, il testo viene emesso solo per "il corpo" di un elemento di stile standard, e se quel corpo non viene afferrato da qualche Javascript o altro, allora vorrei onestamente devo dire di sì. Per corpo intendo che il testo viene emesso nella forma <b><u>$USERINPUT</u></b> ; è testo all'interno del documento HTML e non è già parte del markup in qualche modo. Quindi non è all'interno di qualche tag o blocco speciale.

Tuttavia, molte volte questo non è l'unico caso in cui l'input dell'utente verrà scritto sulla pagina. Se stai scrivendo all'interno di un tag HTML, in genere un valore di attributo, sarà simile a questo: <img src="file.jpg" alt="$USERINPUT" /> . Qui, il filtro su < o > non sarà di aiuto, poiché l'autore dell'attacco può inserire " onload="alert('XSS')" o qualcosa di simile, e l'HTML risultante diventerà <img src="file.jpg" alt="" onload="alert('XSS')" /> , il che significa che può essere eseguito Javascript arbitrario.

E se in qualche modo stai inserendo l'input dell'utente in qualcosa all'interno di un tag <script> , c'è tutta una miriade di cose di cui devi preoccuparti.

Fondamentalmente, basta usare una funzione di sanitizzazione HTML buona e testata. Non dovrai preoccuparti di tutti i casi, se lo fai.

    
risposta data 30.04.2013 - 03:06
fonte
1

No, perché ci sono modi che in realtà omettono il < > tag. L'input dovrebbe essere trattato come una stringa, quindi è necessario codificarlo correttamente. Suggerisco di dare un'occhiata alla owasp testing guide v3

    
risposta data 30.04.2013 - 00:11
fonte

Leggi altre domande sui tag