Antworten:
Mit eval("my script here")
Funktion.
Sie können es mit einer Funktion ausführen. Beispiel:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};
?
new Function("alert('Hello World');")()
Die eval
Funktion wertet eine Zeichenfolge aus, die an sie übergeben wird.
Die Verwendung von eval
kann jedoch gefährlich sein . Verwenden Sie sie daher mit Vorsicht.
Bearbeiten: Annakata hat einen guten Punkt - Es ist nicht nur eval
gefährlich , es ist langsam . Dies liegt daran, dass der auszuwertende Code vor Ort analysiert werden muss, damit einige Rechenressourcen benötigt werden.
eval()
ist gefährlich. Gibt es eine Alternative?
Verwenden Sie eval ().
W3 Schulrundgang durch eval . Die Site enthält einige brauchbare Beispiele für die Bewertung. Die Mozilla-Dokumentation behandelt dies ausführlich.
Sie werden wahrscheinlich viele Warnungen erhalten, wenn Sie dies sicher verwenden. Erlauben Sie Benutzern NICHT, ALLES in eval () zu injizieren, da dies ein großes Sicherheitsproblem darstellt.
Sie möchten auch wissen, dass eval () einen anderen Bereich hat .
eval
mich besser als dieser W3Schools-Artikel. Etwas Lesbares mit guten Erklärungen und Beispielen wäre developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Und nein, ich bin nicht bjorninge
Versuche dies:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Persönlich habe ich es nicht getestet, aber es scheint zu funktionieren.
Ein bisschen wie das, was @Hossein Hajizadeh alerady gesagt hat, allerdings ausführlicher:
Es gibt eine Alternative zu eval()
.
Die Funktion setTimeout()
ist so konzipiert, dass sie nach einem Intervall von Millisekunden etwas ausführt, und der auszuführende Code ist zufällig als Zeichenfolge formatiert.
Es würde so funktionieren:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
bedeutet, dass 1 Millisekunde gewartet wird, bevor die Zeichenfolge ausgeführt wird.
Es ist vielleicht nicht der richtigste Weg, aber es funktioniert.
setTimeout
? Beachten Sie, dass die Ausführung in jedem Fall asynchron ist. Dies bedeutet, dass der gesamte Code, der auf den setTimeout
Aufruf folgt, vor der Übergabe des Codes aufgerufen wird setTimeout
(auch wenn er mit 0 (Null) aufgerufen wird).
Verwenden Sie eval wie unten. Eval sollte mit Vorsicht verwendet werden, eine einfache Suche nach " Eval ist böse " sollte einige Hinweise geben.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Überprüfte dies bei vielen komplexen und verschleierten Skripten:
var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);
Wenn Sie einen bestimmten Befehl (dh eine Zeichenfolge) nach einer bestimmten Zeit ausführen möchten - cmd = Ihr Code - InterVal = Verzögerung bei der Ausführung
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
in InterVal
aktiviert?
Für Benutzer, die Node verwenden und sich mit den Kontextauswirkungen von eval()
NodeJS-Angeboten befassen vm
. Es wird eine virtuelle V8-Maschine erstellt, die die Ausführung Ihres Codes in einem separaten Kontext sandboxen kann.
Wenn Sie noch einen Schritt weiter gehen, wird vm2
die vm
VM härter und kann nicht vertrauenswürdigen Code ausführen.
https://nodejs.org/api/vm.html - Offizielle nodejs / vm
https://github.com/patriksimek/vm2 - Extended vm2
const vm = require('vm');
const x = 1;
const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.
const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);
console.log(sandbox.x); // 42
console.log(sandbox.y); // 17
console.log(x); // 1; y is not defined.
eval(s);
Dies kann jedoch gefährlich sein, wenn Sie Daten von Benutzern übernehmen, obwohl dies vermutlich das Problem ist, wenn sie ihren eigenen Browser zum Absturz bringen.
eval
Code von Benutzern enthält, mit der Benutzer beispielsweise die Konten anderer Benutzer stehlen können, ohne dass sie dies wissen, indem sie nur die Seite laden.
Nicht sicher, ob dies betrügt oder nicht:
window.say = function(a) { alert(a); };
var a = "say('hello')";
var p = /^([^(]*)\('([^']*)'\).*$/; // ["say('hello')","say","hello"]
var fn = window[p.exec(a)[1]]; // get function reference by name
if( typeof(fn) === "function")
fn.apply(null, [p.exec(a)[2]]); // call it with params
Neue Funktion und apply () funktionieren auch zusammen
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ich beantwortete eine ähnliche Frage und bekam eine weitere Idee, wie ich dies erreichen kann, ohne Folgendes zu verwenden eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
Im obigen Code erstellen Sie im Wesentlichen einen Blob, der Ihr Skript enthält, um eine Objekt-URL (Darstellung des Datei- oder Blob-Objekts im Browserspeicher) zu erstellen. Da Sie eine src
Eigenschaft für das <script>
Tag haben, wird das Skript so ausgeführt, als ob es von einer anderen URL geladen worden wäre.
eval sollte es tun.
eval(s);
eval(s);
Denken Sie jedoch daran, dass die Bewertung sehr mächtig und ziemlich unsicher ist. Sie sollten besser sicher sein, dass das von Ihnen ausgeführte Skript für Benutzer sicher und unveränderlich ist.
Man kann mathjs benutzen
Ausschnitt aus dem obigen Link:
// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)') // 5
math.evaluate('sqrt(-4)') // 2i
math.evaluate('2 inch to cm') // 5.08 cm
math.evaluate('cos(45 deg)') // 0.7071067811865476
// provide a scope
let scope = {
a: 3,
b: 4
}
math.evaluate('a * b', scope) // 12
math.evaluate('c = 2.3 + 4.5', scope) // 6.8
scope.c
scope
ist irgendein Objekt. Wenn Sie also den globalen Bereich an die Auswertungsfunktion übergeben, können Sie alert () möglicherweise dynamisch ausführen.
Auch mathjs ist eine viel bessere Option als eval (), da es in einer Sandbox ausgeführt wird.
Ein Benutzer könnte versuchen, schädlichen JavaScript-Code über den Ausdrucksparser einzufügen. Der Ausdrucksparser von mathjs bietet eine Sandbox-Umgebung zum Ausführen von Ausdrücken, die dies unmöglich machen sollten. Es ist jedoch möglich, dass unbekannte Sicherheitslücken bestehen. Daher ist es wichtig, vorsichtig zu sein, insbesondere wenn die serverseitige Ausführung beliebiger Ausdrücke zulässig ist.
Neuere Versionen von mathjs verwenden weder eval () noch Function ().
Der Parser verhindert aktiv den Zugriff auf die interne Auswertung von JavaScripts und die neue Funktion, die die Hauptursache für Sicherheitsangriffe sind. Mathjs Version 4 und höher verwendet nicht die JavaScript-Bewertung unter der Haube. Version 3 und älter verwendeten eval für den Kompilierungsschritt. Dies ist kein direktes Sicherheitsproblem, führt jedoch zu einer größeren möglichen Angriffsfläche.
Die Verwendung von eval und das Erstellen einer neuen Funktion zum Ausführen von Javascript birgt viele Sicherheitsrisiken.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
Ich bevorzuge diese Methode, um das Javascript auszuführen, das ich als Zeichenfolge erhalte.