web-dev-qa-db-fra.com

Comment désinfecter un texte javascript?

J'ai un textarea qui va recevoir un extrait de code js (Google Analytics). Y at-il un moyen de désinfecter cela? Puisque je ne peux pas utiliser des fonctions comme wp_filter_nohtml_kse (), que dois-je utiliser?

3
Daniel

Non, il n'y a pas de fonction pour ça. Vous auriez besoin d'un analyseur JavaScript complet. Cela ne fait pas partie du noyau WordPress.

2
fuxia

Une méthode simple consiste à demander à l'utilisateur de saisir uniquement son ID de propriété Google Analytics, au lieu de lui demander de saisir l'intégralité du code JavaScript. Vous générez ensuite l'extrait vous-même, à l'aide de son ID de propriété.

Selon cette page d'aide Google , voici le code de suivi Analytics actuel:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.Push(['_setAccount', 'UA-XXXXX-Y']);
  _gaq.Push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

'UA-XXXXX-Y' est l'ID de propriété. On dirait que les deux premiers caractères sont toujours 'UA'. 'XXXXX' représente un certain nombre de chiffres (pas nécessairement cinq chiffres, car l'un des ID de propriété de mes sites comporte huit chiffres). 'Y' est un entier pouvant comporter plus d'un chiffre.

Une façon de valider l'ID de propriété serait avec une expression régulière, comme ceci:

preg_match('/^UA-[0-9]+-[0-9]+$/', $input);

Cela retournera 1 si $ input est un format d'identifiant de propriété valide, et false si ce n'est pas le cas.

5
Ben Miller

Si vous voulez permettre à l'utilisateur de saisir son propre code Javascript, mais pas pour lui permettre de saisir du code HTML, vous pouvez utiliser quelque chose comme ceci:

preg_match( '/\A<script((?!<[a-zA-Z])[\s\S])*</script>\Z/', trim($input) );

La fonction trim supprime les espaces du début et de la fin et le motif regex ne correspond à la chaîne que si elle commence par '<script', se termine par '</ script>' et ne comporte pas de caractère '<' immédiatement suivi par une lettre. Cela devrait efficacement garder tout code HTML parasite, tout en permettant à l'utilisateur de mettre du code Javascript en utilisant un opérateur inférieur à, s'il le souhaite pour une raison quelconque.

L'autre chose que je ferais, c'est de m'assurer que seul un administrateur peut définir cette option. S'il introduit un peu de HTML dans le site et casse son propre site Web, c'est de sa faute. Bien sûr, si cela se trouve dans la base de données, assurez-vous qu’elle est conçue pour SQL.

1
Ben Miller