La politique de sécurité de contenu de Mozilla interdit l'utilisation de la fonction javascript eval ainsi que des scripts en ligne. Ils prétendent que toutes les instances d'eval peuvent être remplacées par une autre fonction (espérons-le plus sûre). Je suis d'accord dans la plupart des scénarios, Javascript eval peut être remplacé, mais je ne sais pas si le remplacement est possible pour chaque cas.
Ma question est double:
Les utilisations les plus courantes qui peuvent être substituées sont les suivantes. Je voudrais certainement utiliser ces premiers.
Accès aux propriétés dynamiques
Utilisez: obj[keyAsVariable]
N'utilisez pas eval('obj.' + keyAsVariable)
Parsing JSON
Utilisez JSON.parse(data)
N'utilisez pas eval('(' + data + ')')
Calcul de l'entrée des utilisateurs
Utilisez une certaine bibliothèque
N'utilisez pas eval(input)
Si cela est vraiment nécessaire, vous pouvez également envoyer le script à un serveur qui l'échoue simplement, et vous pouvez le demander en tant que tag de script. Il n'utilisera pas eval
mais l'exécutera toujours. Ce n'est pas sûr car il est envoyé deux fois par Internet.
var s = document.createElement('script') s.src = 'request_script?data=' + data; document.getElementsByTagName('head')[0].appendChild(s);
request_script
pourrait être un fichier implémenté en PHP, comme le suivant. Encore une fois, c'est une mauvaise pratique, mais c'est une façon générique de contourner eval
.
<? echo $_GET['data']; ?>
Vous pourriez dire que cela répond également automatiquement à votre deuxième question avec «non».
Vous pouvez envelopper le script java dans un appel de fonction similaire à JSONP, puis créer dynamiquement une balise de script pour charger cela.
Au lieu d'utiliser eval
vous pouvez également utiliser un Blob
et charger le code comme s'il s'agissait d'un fichier js
externe: Pour vous assurer que les fonctions ou les variables qui se trouvent dans le code que vous chargez sont disponibles, vous devez utiliser une méthode de callback
qui sera Déclenché onload
événement onload
.
var code = "console.log('hello world');"; // With eval: eval(code); // With a blob: var blob = new Blob([code], {type: 'text/javascript'}); var urlCreator = window.URL || window.webkitURL; var url = urlCreator.createObjectURL( blob ); function loadScript(url, callback) { // Add a the script tag to the head var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; // Bind the callback (depends on browser compatibility). script.onreadystatechange = callback; script.onload = callback; // Load the script head.appendChild(script); } // Any variables or methods inside the code will be on callback. loadScript(url, callback);
Remarque Soyez conscient que le danger pour l'injection de code est similaire à eval.