Ich baue eine öffentliche Website auf, auf der Benutzer Daten und Skripte gemeinsam nutzen, um einige Daten zu verarbeiten. Die Skripte werden in diesem Zyklus serverseitig in einer Art Sandbox ohne andere Interaktion ausgeführt: Mein Perl-Programm liest aus einer Datenbank ein vom Benutzer erstelltes Skript, fügt die zu verarbeitenden Daten in das Skript ein (dh ein JSON-Dokument) und ruft dann den Interpreter auf Gibt die Antwort zurück (ein JSON-Dokument oder einfacher Text). Ich speichere sie mit meinem Perl-Skript in der Datenbank. Das Skript sollte in der Lage sein, selbst auf integrierte Funktionen zuzugreifen, die der Skriptsprache hinzugefügt wurden, aber nicht mehr.
Ich bin also auf node.js als Javascript-Interpreter gestoßen, und das vor ungefähr einer Stunde mit Googles V8 (macht v8 für so etwas Sinn?). CoffeeScript kam mir auch in den Sinn, da es gut aussieht und immer noch Javascript ist.
Ich denke, Javascript ist weit genug verbreitet und "sandboxfähiger", da es keine Betriebssystemaufrufe oder irgendetwas entfernt Unsicheres gibt (glaube ich).
Übrigens schreibe ich das System auf Perl und Php für das Frontend.
Um die Frage zu verbessern: Ich wähle Javascript, weil ich denke, dass es sicher und einfach genug ist, um es mit node.js zu implementieren. Aber welche anderen Alternativen gibt es, um diese Art von Aufgabe zu erfüllen? Lua? Python? Ich kann einfach keine Informationen darüber finden, wie ein Sandbox-Interpreter ordnungsgemäß ausgeführt wird.
Antworten:
Java enthält einen integrierten JavaScript-Interpreter. Es ist nicht standardmäßig eine Sandbox, dies kann jedoch aktiviert werden durch:
java = undefined;Packages = undefined;org = undefined;
Wenn Sie dies tun, sollten Skripte, die innerhalb ausgeführt werden, in keiner Weise auf die externe Umgebung zugreifen können.
Es bietet auch Funktionen zur Begrenzung des Skript-Timeouts und zur Begrenzung der Befehlsanzahl, die für das Sandboxing nützlich sind. Sie können festlegen, wie lange oder wie komplex das Skript ist.
Ich habe dies in Java 7 verwendet, das über eine Rhino JavaScript-Engine verfügt. Java 8 hat eine neuere, modernere Engine Nashorn - ich habe es nicht mit Nashorn versucht, aber ich gehe davon aus, dass es ähnlich sein sollte.
quelle
window
Variablen für JavaScript definiert , um die Interaktion zu ermöglichen.Mein erster Gedanke war node.js - wie Sie oben erwähnt haben, ist es ein Javascript-Interpreter. Und genau das brauchen Sie, wenn Sie die Skripte auf wirklich sichere Weise sandboxen möchten.
Eine andere Möglichkeit könnte sein, dass Sie jeden Befehl in einem Skript überprüfen, ob er gültig ist oder nicht. Aber ich glaube nicht, dass Sie eine sichere Sandbox bekommen.
Schöne Grüße
quelle