web-dev-qa-db-fra.com

Passez une chaîne PHP à une variable JavaScript (et évitez les retours à la ligne)

Quel est le moyen le plus simple de coder une chaîne PHP pour la sortie dans une variable JavaScript?

J'ai une chaîne PHP qui inclut des guillemets et des retours à la ligne. J'ai besoin que le contenu de cette chaîne soit mis dans une variable JavaScript.

Normalement, je construirais simplement mon code JavaScript dans un fichier PHP, à la:

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

Toutefois, cela ne fonctionne pas lorsque $myVarValue contient des guillemets ou des nouvelles lignes.

366
David Laing

Développer la réponse de quelqu'un d'autre:

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

Utiliser json_encode () nécessite:

  • PHP 5.2.0 ou supérieur
  • $myVarValue codé au format UTF-8 (ou US-ASCII, bien sûr)

Étant donné que UTF-8 prend en charge le format Unicode complet, la conversion à la volée devrait être sûre.

Notez que, comme json_encode échappe aux barres obliques, même une chaîne contenant </script> sera échappée en toute sécurité pour l'impression avec un bloc de script.

503
bobwienholt

l'encoder avec JSON

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

J'ai eu un problème similaire et je comprends que ce qui suit est la meilleure solution:

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

Cependant, le lien que micahwittman a posté suggère qu'il existe quelques différences mineures d'encodage. La fonction rawurlencode() de PHP est supposée être conforme à RFC 1738 , alors qu'il semble n'y avoir eu aucun effort de ce type avec la decodeURIComponent() de Javascript.

21
pr1001

La version paranoïaque: Échapper à chaque caractère .

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: La raison pour laquelle json_encode() peut ne pas être appropriée est que vous devez parfois empêcher la génération de ", par exemple.

<div onclick="alert(???)" />
10
giraff
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

ou

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

La solution de Micah ci-dessous a fonctionné pour moi car le site que je devais personnaliser n'était pas en UTF-8, je ne pouvais donc pas utiliser json; Je voterais mais mon représentant n'était pas assez élevé.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
5
user291681

Ne l'exécutez pas cependant addslashes(); si vous êtes dans le contexte de la page HTML, l'analyseur HTML peut toujours voir la balise </script>, même au milieu de la chaîne, et supposer que c'est la fin du code 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>
4
Craig Francis

Vous pouvez l'insérer dans une DIV cachée, puis affecter le innerHTML de la DIV à votre variable JavaScript. Vous n'avez pas à vous soucier d'échapper à rien. Assurez-vous simplement de ne pas mettre du HTML cassé à l'intérieur.

Tu pourrais essayer

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
3
Jacob
  1. Ne pas. Utilisez Ajax, mettez-le dans les attributs data-* de votre code HTML, ou quelque chose de significatif. L'utilisation de scripts intégrés augmente la taille de vos pages et risque de ne pas être sûr ou de permettre aux utilisateurs de détruire la mise en page , à moins que…

  2. … Vous créez une fonction plus sûre:

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

htmlspecialchars

La description

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

Certains caractères ont une signification particulière en HTML et doivent être représentés par des entités HTML pour préserver leur signification. Cette fonction renvoie une chaîne avec certaines de ces conversions. les traductions effectuées sont les plus utiles pour la programmation Web quotidienne. Si vous souhaitez que toutes les entités de caractères HTML soient traduites, utilisez plutôt htmlentities ().

Cette fonction est utile pour empêcher le texte fourni par l'utilisateur de contenir du balisage HTML, comme dans un tableau d'affichage ou une application de livre d'or.

Les traductions effectuées sont:

* '&' (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