2012-03-26 42 views
4
  • Ist vm.runInNewContext wie eval schwarze Magie in Betracht gezogen?
  • Gibt es eine signifikante Leistungsdifferenz zwischen require und Lesen einer Datei und mit vm es laufen oder ist das das gleiche unter der Haube (wenn Sie Caching usw. implementiert und wollte nur ein paar Variablen der Kontext hinzufügen)

Antwort

3

runInNewContext sollte nicht als Ersatz von require oder eval, sondern als Möglichkeit genutzt werden, um eine Sandbox-Umgebung zu schaffen, in dem Sie sicher andere Skripte ausgeführt werden können.

Nachteile sind, dass es langsam ist (die Erstellung dauert ~ 10 ms.) Und dauert ein paar Megabyte. Also nein, verwenden Sie es nicht als Ersatz.

+0

Also, wenn ich es verwenden würde, um ein Controller-Objekt ('/ controllers/blog_controller.js') zu laden und einige Helfer in den Kontext aufzunehmen, gäbe es fast keine Leistungseinbuße richtig? (der Controller wird nur einmal geladen) –

+0

Tun Sie es einfach nicht. Es wird als sehr schlechte Praxis für allgemeine Zwecke betrachtet. Warum denken Sie, dass Sie Ihren eigenen Controller-Code sandboxen müssen? –

+0

Die gleichen Gründe, warum Railway-js es verwendet, bieten den Controllern einen besseren Kontext, aber ich fand eine ziemlich gute Lösung, die mir besser gefällt, als 'vm' zu verwenden. Vielen Dank! –

7

Wenn Sie den Code, der implements loading Modules in node.js auschecken, sehen Sie, dass erfordern vm.runInNewContext oder vm.runInThisContext unter der Haube. Die require tut jedoch einige andere Extras, wie das Zwischenspeichern des Moduls.

Die node documentation zeigt, wie das Verhalten zwischen den vm-Befehlen und eval ähnlich und unterschiedlich ist.

Also, erfordern, Eval und VM sind alle ein bisschen anders, aber alle können verwendet werden, um Code zu laden. Sie haben alle ähnliche Sicherheitsprobleme, wenn Sie willkürlichen Code laden, der vom Client kommt.

+0

Nur für die Aufzeichnung, da der Quellcode-Link zu node.js oben ist "alt", hier ist eine neuere 7.10.0 Quellcode-Link: https://github.com/nodejs/node/blob/v7.10.0 /lib/module.js#L543 Sie verwenden 'vm.runInThisContext' oder' vm.runInDebugContext'. Über 'eval' Mit einem Komma-Ausdruck wie' (0, eval) (....) 'kann das Skript im globalen Gültigkeitsbereich ausgewertet werden, so dass es den lokalen Bereich nicht verschmutzen kann, wie in dem docu link-Beispiel von node.js gezeigt Sie suchen auf der Seite nach "eval". –