Qual è il modo più semplice per codificare una stringa PHP per l'output su una variabile JavaScript?
Ho una stringa PHP che include citazioni e newline. Ho bisogno che il contenuto di questa stringa sia inserito in una variabile JavaScript.
Normalmente, vorrei solo costruire il mio JavaScript in un file PHP, a la:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
Tuttavia, questo non funziona quando $myVarValue
contiene citazioni o newline.
Espansione sulla risposta di qualcun altro:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Utilizzando json_encode () richiede:
$myVarValue
codificato come UTF-8 (o US-ASCII, ovviamente)Poiché UTF-8 supporta Unicode completo, dovrebbe essere sicuro convertirlo al volo.
Si noti che poiché json_encode
sfugge alle barre in avanti, anche una stringa che contiene </script>
verrà sfuggita in modo sicuro per la stampa con un blocco di script.
codificalo con JSON
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
Ho riscontrato un problema simile e ho compreso che la soluzione migliore è la seguente:
<script>
var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
Tuttavia, il collegamento che micahwittman ha pubblicato suggerisce che ci sono alcune piccole differenze di codifica. La funzione rawurlencode()
di PHP dovrebbe rispettare RFC 1738 , mentre sembra che non ci sia stato alcuno sforzo con la funzione decodeURIComponent()
di Javascript.
La versione paranoica: Escaping di ogni singolo carattere .
function javascript_escape($str) {
$new_str = '';
$str_len = strlen($str);
for($i = 0; $i < $str_len; $i++) {
$new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
}
return $new_str;
}
EDIT: Il motivo per cui json_encode()
potrebbe non essere appropriato è che a volte, è necessario impedire che venga generato "
, ad es.
<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
o
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
La soluzione di Micah di seguito ha funzionato per me poiché il sito che dovevo personalizzare non era in UTF-8, quindi non potevo usare json; Lo voterei, ma il mio rappresentante non è abbastanza alto.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
Puoi inserirlo in un DIV nascosto, quindi assegnare il innerHTML del DIV alla tua variabile JavaScript. Non devi preoccuparti di sfuggire a qualcosa. Assicurati di non inserire HTML non valido.
Non eseguirlo anche se addslashes()
; se sei nel contesto della pagina HTML, il parser HTML può ancora vedere il tag </script>
, anche mid-string, e supporre che sia la fine del JavaScript:
<?php
$value = 'XXX</script><script>alert(document.cookie);</script>';
?>
<script type="text/javascript">
var foo = <?= json_encode($value) ?>; // Use this
var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
Potresti provare
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
Non farlo. Usa Ajax, inseriscilo negli attributi data-*
nel tuo codice HTML o qualcos'altro significativo. L'uso di script inline rende le pagine più grandi e potrebbe non essere sicuro o consentire comunque agli utenti di rovinare il layout , a meno che ...
... tu fai una funzione più sicura:
function inline_json_encode($obj) {
return str_replace('<!--', '<\!--', json_encode($obj));
}
htmlspecialchars
Descrizione
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
Alcuni caratteri hanno un significato speciale in HTML e dovrebbero essere rappresentati da entità HTML se vogliono preservare i loro significati. Questa funzione restituisce una stringa con alcune di queste conversioni realizzate; le traduzioni fatte sono quelle più utili per la programmazione web quotidiana. Se hai bisogno di tradurre tutte le entità di carattere HTML, usa invece htmlentities ().
Questa funzione è utile per impedire al testo fornito dall'utente di contenere il markup HTML, ad esempio in una bacheca di messaggi o in un libro degli ospiti.
Le traduzioni eseguite sono:
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'