In foglio cheat OWASP XSS è scritto
In addition to the 5 characters significant in XML (&, <, >, ", '), the forward slash is included as it helps to end an HTML entity.
Quindi le escaping consigliate sono
& --> &
< --> <
> --> >
" --> "
' --> '
/ --> /
Che cosa succede se ho saltato gli escape di /
? Quali sono gli esempi di carico utile di un utente malintenzionato utilizzando solo /
che può attivare XSS o altri attacchi (supponendo che & < > " '
sia stato eseguito l'escape)?
Nel mio particolare scenario, abbiamo un filtro XSS nel servlet Java, che sanifica il carico utile di tutte le richieste HTTP in ingresso (può essere discusso se è una buona soluzione o no), e sostituisce / --> /
che è un dolore perché /
è un carattere valido nei nomi delle strade ecc. Un'opzione potrebbe essere quella di redecificare / --> /
, ma mi chiedo se ci sono dei meriti nel mantenere /
di escape?
Modifica: perché non voglio avere /
per essere sfuggito:
Il /
è preceduto da escape prima che i dati arrivino al codice Java che salva elementi in DB. Quindi, Java chiede al DB di salvare i dati di escape, quindi quando l'app di frontend chiede a Java di restituirci i dati, restituisce un JSON come
{something: "a / b"}
invece di
{something: "a / b"}
(beh, per risolvere il problema, potremmo semplicemente fare in modo che il codice Java esegua l'iterazione sulla struttura che restituisce e lo annulli, ma forse non ha senso scapparlo in primo luogo?)
Si noti che lo stesso backend viene utilizzato da molti frontend, alcuni dei quali non HTML. Non ha senso utilizzare i dati HTML di escape come JSON, in particolare per i consumatori non HTML (correggimi se ho torto).
Inoltre, nell'app HTML, utilizziamo il codice angolare come questo
<p>Hello {{name}}!</p>
che, quando viene dato a / b
, stamperà letteralmente quella stringa all'utente (ad esempio, Angular esegue un altro ciclo di escape sostituendo &
a &
ecc.).
Per avere le entità HTML interpretate, dovrei usare ng-bind-html
(vedi questo plunk )
<p>Hello <span ng-bind-html="name"></span>!</p>
ma mi aspetto che i miei contenuti JSON siano di testo normale, quindi non voglio usare ng-bind-html
poiché abbassa la sicurezza.