Alternatives pour Javascript eval

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:

  1. Existe-t-il un moyen générique de remplacer chaque fonction eval de javascript? (Ne doit pas être sécurisé)
  2. Existe-t-il un cas où l'eval de Javascript ne peut pas être remplacé?

Les utilisations les plus courantes qui peuvent être substituées sont les suivantes. Je voudrais certainement utiliser ces premiers.

  1. Accès aux propriétés dynamiques

    Utilisez: obj[keyAsVariable]

    N'utilisez pas eval('obj.' + keyAsVariable)

  2. Parsing JSON

    Utilisez JSON.parse(data)

    N'utilisez pas eval('(' + data + ')')

  3. 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.

Charger comme script à l'aide d'un Blob

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.