Modo corretto di proteggere da XSS, quando l'output è direttamente in JS non HTML?

8

Sto vedendo un sacco di esempi quando l'output è diretto all'HTML, ma sto vedendo informazioni più contrastanti quando l'output sta andando direttamente in JS.

Ad esempio se il codice era:

var thisIsATest = '<?php echo $_GET['a']; ?>';

E il vettore di attacco URL era:

?a=';alert(1);'

L'output viene visualizzato come:

var thisIsATest = '';alert(1);'';

Ho visto molti documenti che consigliano cosa evitare (come addslashes) e riferimenti a htmlspecialchars () (ma non da solo) ...

Qual è l'approccio più corretto?

    
posta Jason Vendryes 09.01.2016 - 00:41
fonte

1 risposta

12

Il modo corretto è usare gli strumenti del tuo framework (e il suo motore di template, se disponibile). Se stai armeggiando con PHP nelle stringhe JS, probabilmente rendi la vita più difficile e più pericolosa del necessario.

Con un semplice PHP un approccio comune e sicuro è usare json_encode() come spiegato stackoverflow.com/questions/6816787/json-php-to-javascript-safe-or-not/6817147#6817147">here. Per esempio:.

var foo = <?php echo json_encode($foo, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>

json_encode() restituisce la rappresentazione JSON di un valore, quindi è garantito per evaolare su un oggetto valido nel tuo codice JS e puoi semplicemente assegnarlo a una variabile come mostrato. Ma non omettere i flag aggiuntivi. A seconda del contesto, un utente malintenzionato potrebbe altrimenti utilizzare payload come </script> per uscire dall'intero tag dello script.

Le funzioni htmlentities() e htmlspecialchars() a cui ti riferisci sono usate per l'output HTML diretto e non dovrebbero essere utilizzate su JS. Permettono inoltre alla stringa di contenere interruzioni di riga, causando un errore di sintassi che potrebbe avere conseguenze sulla sicurezza.

Parlando di framework, Wordpress ti fornisce il wrapper wp_json_encode() , come raccomandato in questa linea guida . Potrebbero esserci funzioni equivalenti per il tuo framework.

Tieni presente che con json_encode() l'oggetto viene preparato in modo sicuro per un contesto JS, ma qualsiasi stringa che passi può contenere ancora tag HTML che non sarebbero sicuri da inserire tramite, ad esempio, document.write() o innerHTML . (Evita questi due insieme.)

Questo è sciocco, ma XSS-safe:

Hello, <span id="display"></span>!
<?php $name = $_GET['name']; ?>
<script>
    var name = <?php echo json_encode($name, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>;
    display.textContent = name;
</script>
    
risposta data 09.01.2016 - 02:26
fonte

Leggi altre domande sui tag