2014-03-27 3 views
5

Ich benutze ACE Editor als meinen Texteditor auf meiner Seite und der Benutzer wird es Code eingeben.Wie kann ich Code ausführen, den ein Benutzer in meinen ACE-Editor auf meiner Seite eingibt

  1. Ich suche Code auszuführen, der vom Benutzer am oder im Browser eingegeben wurde, wenn möglich. Wie bekomme ich die Eingabe vom Editor und benutze den Browser V8 JavaScript Compiler damit?

  2. Ich werde dann versuchen, es auf einem Node.js zu starten, aber zuerst muss ich Knoten lernen :).

Antwort

11

Es ist relativ einfach, einige Benutzer eingegebenen Code zu greifen und es mit JavaScript auszuführen. Im Wesentlichen werden Sie den Code von ACE:

dann verwenden Sie Javascript, um es auszuführen. Auf der einfachsten Ebene können Sie einfach tun:

eval(code); 

aber Sie probably don't want to use eval(). Stattdessen könnten Sie etwas tun wie:

// grabbed from https://stackoverflow.com/questions/6432984/adding-script-element-to-the-dom-and-have-the-javascript-run 
var script = document.createElement('script'); 
try { 
    script.appendChild(document.createTextNode(code)); 
    document.body.appendChild(script); 
} catch (e) { 
    script.text = code; 
    document.body.appendChild(script); 
} 

Dies wird funktionieren. Es wird jedoch weiterhin einige Probleme verursachen, da der Benutzercode sich auf Ihre Umgebung auswirken kann. In diesem Szenario ist es aus Sicherheitssicht möglicherweise nicht schrecklich (es sei denn, der Benutzer kann seinen Code teilen), aber es wäre verwirrend. Aus diesem Grund möchten Sie sandbox your code.

This answer explains sandboxing client side javascript, mit window.postMessage können Sie Javascript an den Sandboxed iframe senden und dort ausgewertet werden.

Wenn Sie diese Server-Seite erstellen und Knotencode ausführen möchten, müssen Sie Sandboxing anders durchführen. Auf einem Server spielt das Sandboxing eine größere Rolle, da der Benutzer viel mehr mit Javascript zu tun hat und böswillig mit dem Server interagieren kann. Glücklicherweise gibt es a few sandboxes for Node that should help.

+0

Danke Nick ich schätze es. – inoabrian

+0

vielen Dank !!! –

0

Erste-Code ist der einfache Teil code = editor.getValue() nur tun
einfach unter Verwendung von V8-Compiler ist zu einfach, iframe zu erstellen und

try { 
    var result = iframeWindow.eval(code) 
} catch(e) { 
    // report error... 
} 

zu tun, aber das wird nicht sehr nützlich sein, da es sehr sein einfach endlose Schleifen zu erstellen und die Seite zu brechen.
Sie können sich https://github.com/jsbin/jsbin/blob/master/public/js/runner/loop-protect.js#L7 ansehen, um das Schleifenproblem zu lösen.

+0

Vielen Dank, ich werde es untersuchen. Und ich werde auch den Code posten, den ich bereits habe. – inoabrian

Verwandte Themen