Vm2: Prise en charge de l'exécution de vm2 dans le navigateur

Créé le 31 juil. 2017  ·  15Commentaires  ·  Source: patriksimek/vm2

Succursale: https://github.com/patriksimek/vm2/tree/feature-browsers
Bibliothèque: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Usage

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

Questions

  • Le bac à sable peut être échappé via window.top .

FAIRE

  • Supprimez NodeVM de la version du navigateur.
  • Ajoutez BrowserVM à la version du navigateur avec des fonctionnalités liées au navigateur.
  • Tests de navigateur automatisés.
feature request help wanted

Commentaire le plus utile

Je pense utiliser des web workers pour faire fonctionner vm2 dans les navigateurs. Je vais essayer.

Tous les 15 commentaires

Une solution quelque peu piratée pourrait impliquer une réécriture AST pour encapsuler manuellement chaque accès à la propriété. Par exemple, let x = foo.bar serait réécrit en let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar) .

Voici un exemple de réécriture AST, où les nœuds d'appel de fonction sont enveloppés dans des nœuds comme celui-ci .

Les inconvénients de cette approche sont que vous ne pouvez pas facilement déboguer le code réécrit et qu'il faut des solutions de contournement pour gérer Function, eval, etc.

Je pense que le seul moyen est très lourd qui consiste essentiellement à interpréter JS vous-même, ou à remplacer les constructions Functions par une implémentation personnalisée (comme injecter des variables et analyser le contenu). Cette méthode serait très difficile à mettre en œuvre.

La suppression de variables est impossible en raison de variables telles que document et top qui ne peuvent être ni supprimées ni écrasées.

@ io4 , remplacer Function, eval et autres au moment de l'exécution est certainement possible avec la réécriture AST et ce n'est pas non plus très difficile. Cependant, cela entraîne une forte baisse des performances, à la fois au "moment de la compilation" car vous devez réécrire littéralement chaque appel de fonction et au moment de l'exécution puisque les appels de fonction doivent passer par une couche d'indirection.

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

Veuillez ne pas fermer, c'est un problème pertinent.

Je pense utiliser des web workers pour faire fonctionner vm2 dans les navigateurs. Je vais essayer.

Peut-être que vous pouvez également le mettre dans une iframe en bac à sable. De cette façon, s'il s'échappe, il est toujours limité au cadre et ne peut pas naviguer dans le contexte de navigation de niveau supérieur.

Le statut est que nous ne pouvons pas utiliser de web workers car ils ne partagent pas de mémoire avec l'hôte. J'étais en train de tester l'iframe en bac à sable, mais aucun succès là non plus. Sans l'option allow-same-origin , vm2 ne démarre même pas. Avec cette option activée, je peux accéder à la fenêtre de niveau supérieur. Mais je n'abandonne pas :)

Quel genre d'erreur cela vous a-t-il donné? Avait-il besoin d'accéder à une variable? Manquait-il une bibliothèque? Des données qui pourraient être récupérées en échangeant des messages entre iframes?

227 est intéressant, d'autant plus que Realms a été mentionné spécifiquement pour le sandboxing du navigateur.

J'ai essayé de réparer l'accès à la fenêtre avec la même astuce que realms-shim.
Une implémentation peut être trouvée ici: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
L'inconvénient est que tout ce qui se trouve dans la VM fonctionne en mode strict.

@patriksimek pour contourner le problème window.top , ne pourriez-vous pas observer l'objet et tuer le script (lancer et erreur) s'il est modifié / utilisé? Alors, observez les propriétés et enveloppez les fonctions

Succursale: https://github.com/patriksimek/vm2/tree/feature-browsers
Bibliothèque: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Usage

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

Questions

  • Sandbox peut être échappé via window.top .

FAIRE

  • Supprimez NodeVM de la version du navigateur.
  • Ajoutez BrowserVM à la version du navigateur avec des fonctionnalités liées au navigateur.
  • Tests de navigateur automatisés.

Je ne connais pas de moyen d'observer window ou window.top d'une manière qui permette de lancer avant que quelque chose n'arrive.

salut
J'ai besoin d'importer vm2.js en tant que module dans un fichier dactylographié.
Puis-je avoir une aide s'il vous plait? Merci

salut
J'ai besoin d'importer vm2.js en tant que module dans un fichier dactylographié.
Puis-je avoir une aide s'il vous plait? Merci

Fonctionnement en module: ajout de module.exports = vm2; à la fin du fichier.

Cette page vous a été utile?
0 / 5 - 0 notes