11
votes

Alternatives pour JavaScript Eval

La stratégie de sécurité de contenu désactive l'utilisation de la fonction Eval JavaScript ainsi que scripts en ligne. Ils prétendent que toutes les instances d'EVAL peuvent être remplacées par une autre fonction (espérons-la 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. Y a-t-il une façon générique de remplacer chaque fonction Eval JavaScript? (ne doit pas être sûr)
  2. Y a-t-il un cas où le JavaScript Eval ne peut pas être remplacé?

4 commentaires

Veuillez poster un exemple, où vous n'êtes pas sûr de le remplacer. Sinon, c'est un peu difficile de vous aider.


Eh bien, le problème est que je ne peux pas trouver un exemple où je ne peux pas remplacer. Cependant, je ne peux pas non plus trouver une manière générique de remplacer EVAL (c'est différent pour chaque cas).


@Tony: Avez-vous un cas d'utilisation du monde réel ou êtes-vous simplement intéressé de voir si une transformation universelle de eval à une autre construction de langue existe?


Mozilla permet eval fonctionner. À partir de août 2018.


3 Réponses :


3
votes

Vous pouvez envelopper le script Java dans un appel de fonction similaire à JSONP, puis créer de manière dynamique une balise de script à charger cela.


3 commentaires

désolé pouvez-vous expliquer cela un peu plus? Si je veux exécuter: eval (document.cookie = "quelques entrées d'utilisateur"); Comment remplacez-vous cela par un appel de fonction JavaScript sans utiliser Eval?


Donc, si le code que vous essayiez d'être exécuté était var test = "bonjour monde"; vous pouvez convertir cela en fonction () {var test = "bonjour world"} alors vous généreriez de manière dynamique une étiquette de script à charger ce code qui évaluerait


J'ai pensé cela aussi, mais cela fonctionne-t-il pour chaque cas?



19
votes

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

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

    Utilisez: obj [keasvariable]

    n'utilise pas eval ('obj.' + keysvariable)

  2. analyse JSON

    Utilisez json.parse (données)

    n'utilise pas eval ('("+ données +') ')

  3. Calcul de l'utilisateur utilisateur

    Utilisez un certain bibliothèque

    n'utilise pas eval (entrée)

    Si vraiment nécessaire, vous pouvez également envoyer le script à un serveur qui le fait simplement l'écho, et vous pouvez le demander comme une étiquette de script. Il n'utilisera pas eval mais l'exécuter toujours. Ce n'est pas en sécurité car il est envoyé deux fois sur Internet. xxx

    request_script pourrait être un fichier implémenté dans PHP, comme ce qui suit. Encore une fois, c'est une mauvaise pratique mais est une façon générique de contourner eval . xxx

    Vous pouvez dire que cela répond également automatiquement à votre deuxième question avec "Non '.


2 commentaires

Merci, la méthode du script de demande est ce que je recherche.


@PIMVDB Pas besoin de le rebondir sur un serveur. Vérifiez ma réponse ajoutée pour un altentif à cette suggestion ...



4
votes

Charger en tant que 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 js externe fichier: Pour vous assurer que les fonctions ou variables qui se trouvent à l'intérieur du code que vous chargez sont disponibles, vous devez utiliser une méthode Callback qui sera déclenchée Overload événement. < Pré> xxx

note sût être conscient que le danger pour l'injection de code est similaire à Eval.


2 commentaires

Ce n'est pas dupliquer


Super! Ce qui doit être modifié si code doit recevoir un argument et il a une valeur de retour?