it-swarm-eu.dev

Passa una stringa PHP a una variabile JavaScript (e sfuggi alle nuove righe)

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.

361
David Laing

Espansione sulla risposta di qualcun altro:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

Utilizzando json_encode () richiede:

  • PHP 5.2.0 o successivo
  • $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.

497
bobwienholt

codificalo con JSON

26
Javier
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
21
micahwittman

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.

20
pr1001

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(???)" />
10
giraff
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

o

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
6
Kld

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'\\"))); 
} 
5
user291681

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>
3
Craig Francis

Potresti provare

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
3
Jacob
  1. 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 ...

  2. ... tu fai una funzione più sicura:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
3
Ry-

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 '&amp;'
* '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
* '<' (less than) becomes '&lt;'
* '>' (greater than) becomes '&gt;'

http://ca.php.net/htmlspecialchars

2
Chris MacDonald