Was sind meine Auswahlmöglichkeiten für serverseitiges Sandbox-Scripting? [geschlossen]

11

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.

alfa64
quelle
Es ist nicht klar, was Sie fragen. Ist es möglich? Sicher ist es möglich.
Robert Harvey

Antworten:

3

Java enthält einen integrierten JavaScript-Interpreter. Es ist nicht standardmäßig eine Sandbox, dies kann jedoch aktiviert werden durch:

  • Einstellen des richtigen Klassenverschlusses - JavaScript kann normalerweise Java-Klassen laden. Class Shutter ist eine Art Sicherheitsmanager, der entscheidet, welche Klassen geladen werden können und welche nicht.
  • "Startup" -Skript - kurze JavaScript-Initialisierung, die Zugriffspunkte auf das äußere System löscht: 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.

qbd
quelle
Können Sie eher eine Whitelist als eine Blacklist erstellen?
Petah
@Petah, Sie können zuerst alles deaktivieren (auf die schwarze Liste setzen) und dann bestimmte Funktionen in Form von Objekten in die Sandbox verschieben. Dies ist dann im Wesentlichen eine Whitelist. Ja, das können Sie tun.
qbd
JavaScript-Kenntnisse sind weit genug verbreitet, um eine gute Wahl als Skriptsprache zu sein. Möglicherweise möchten Sie einige globale Elemente sowie Anrufe für Benutzer definieren, da Sie den Zugriff auf Anrufe einschränken. Überlegen Sie, wie der Browser windowVariablen für JavaScript definiert , um die Interaktion zu ermöglichen.
Michael Shopsin
2

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

Tobi
quelle
Gibt es eine Sandbox-Unterstützung für NodeJS oder für NodeJS?
Ysdx
4
Gefunden dies: gf3.github.com/sandbox
ysdx
+1 für den tollen Link zur "NIFTY JAVASCRIPT SANDBOX FOR NODE.JS".
Jack Stone
Hinweis: Aus der gf3-Sandbox kann herausgebrochen werden.
Petah