In this specific case, if I replace \
with \
and "
with \"
is it possible to trick my filter?
Non è sufficiente, il tuo filtro non è sicuro.
Ad esempio, un vettore di attacco XSS valido sarebbe </script><svg onload=alert(1)>
, per finire con:
<script>
var test = {src: "test", layer: {"input": "</script><svg onload=alert(1)>", "event": "ready"}};
</script>
Poiché l'albero XML (HTML) viene analizzato prima della valutazione di qualsiasi JS, il tag di script di chiusura ( </script>
) termina lo script nonostante venga inserito in una stringa JS.
Un altro problema con il filtro sono interruzioni di riga. Se un utente malintenzionato può inserire un byte 0x0a
, può interrompere lo script causando un errore di sintassi (poiché una stringa con doppia quotatura non può estendersi su più righe):
<script>
var test = {src: "test", layer: {"input": "
", "event": "ready"}};
</script>
Se stai usando PHP, una comoda funzione di filtro per lavorare in sicurezza con l'input dell'utente all'interno di JS è json_encode()
. Da questa risposta :
With plain PHP a common and safe approach is to use
json_encode()
as explained here. E.g.:
var foo = <?php echo json_encode($foo, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>
json_encode()
returns the JSON representation of a value, hence it's
guaranteed to evaulate to a valid object in your JS code and you can
just assign it to a variable as shown. But don't omit the additional
flags. Depending on the context, an attacker could otherwise use
payloads like </script>
to break out of the entire script tag.