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>