Odpowiedzi:
Z eval("my script here")
funkcją.
Możesz to wykonać za pomocą funkcji. Przykład:
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');")()
eval
Funkcja oceni ciąg znaków, który jest przekazywany do niego.
Ale używanie eval
może być niebezpieczne , więc używaj go ostrożnie.
Edycja: annakata ma dobry punkt - jest nie tylko eval
niebezpieczna , ale także powolna . Dzieje się tak, ponieważ kod, który ma zostać oceniony, musi zostać przeanalizowany na miejscu, więc zajmie to trochę zasobów obliczeniowych.
eval()
to niebezpieczne. Czy jest jakaś alternatywa?
Użyj eval ().
Wycieczka po Eval Schools W3 . Witryna zawiera kilka użytecznych przykładów eval. Dokumentacja Mozilli opisuje to szczegółowo.
Prawdopodobnie otrzymasz wiele ostrzeżeń dotyczących bezpiecznego korzystania z tego. NIE zezwalaj użytkownikom na wstrzykiwanie czegokolwiek do eval (), ponieważ jest to ogromny problem bezpieczeństwa.
Będziesz także chciał wiedzieć, że eval () ma inny zakres .
eval
lepiej dla mnie niż ten artykuł W3Schools. Coś czytelnego, z dobrym wyjaśnieniem i przykładami, to developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . I nie, nie jestem bjorninge
Spróbuj tego:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Osobiście tego nie testowałem, ale wydaje się, że działa.
Trochę tak, jak powiedział @Hossein Hadżizadeh Alerady, choć bardziej szczegółowo:
Istnieje alternatywa dla eval()
.
Funkcja setTimeout()
została zaprojektowana do wykonania czegoś po upływie milisekund, a kod, który ma zostać wykonany, jest sformatowany jako łańcuch.
To działałoby tak:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
oznacza, że będzie czekał 1 milisekundę przed wykonaniem ciągu.
Może nie jest to najbardziej poprawny sposób, ale działa.
setTimeout
? Zauważ, że w każdym przypadku sprawi, że wykonanie będzie asynchroniczne. Oznacza to, że cały kod następujący po setTimeout
wywołaniu zostanie wywołany przed kodem przekazanym do setTimeout
(nawet jeśli zostanie wywołany z wartością 0 (zero)).
Użyj eval jak poniżej. Eval należy używać z ostrożnością, proste wyszukiwanie hasła „ eval is evil ” powinno dać kilka wskazówek.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Sprawdziłem to w wielu skomplikowanych i zaciemnionych skryptach:
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);
Jeśli chcesz wykonać określone polecenie (czyli ciąg znaków) po określonym czasie - cmd = twój kod - InterVal = opóźnienie uruchomienia
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
w InterVal
kapitalizowane?
Dla użytkowników, którzy używają węzła i są zaniepokojeni konsekwencjami kontekstowymi eval()
ofert nodejsvm
. Tworzy maszynę wirtualną V8, która może sandboxować wykonywanie kodu w oddzielnym kontekście.
Pójście o krok dalej powoduje vm2
utrudnienie, vm
pozwalając maszynie wirtualnej na uruchomienie niezaufanego kodu.
https://nodejs.org/api/vm.html - Oficjalny plik nodejs / vm
https://github.com/patriksimek/vm2 - Rozszerzony 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);
Ale może to być niebezpieczne, jeśli pobierasz dane od użytkowników, chociaż przypuszczam, że jeśli wyrządzą im awarię własnej przeglądarki, to ich problem.
eval
użytkowników, która może na przykład pozwolić użytkownikom na kradzież kont innych użytkowników bez ich wiedzy, po prostu ładując stronę.
Nie jestem pewien, czy to oszustwo, czy nie:
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
Nowa funkcja i Apply () również działają razem
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Odpowiadałem na podobne pytanie i wpadłem na kolejny pomysł, jak to osiągnąć bez użycia eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
W powyższym kodzie zasadniczo tworzysz Blob, zawierający twój skrypt, w celu utworzenia adresu URL obiektu (reprezentacja obiektu File lub Blob w pamięci przeglądarki). Ponieważ masz src
właściwość na <script>
tagu, skrypt zostanie wykonany w taki sam sposób, jakby został załadowany z dowolnego innego adresu URL.
eval powinien to zrobić.
eval(s);
eval(s);
Pamiętaj jednak, że eval jest bardzo potężny i dość niebezpieczny. Lepiej mieć pewność, że wykonywany skrypt jest bezpieczny i niezmienny przez użytkowników.
Można użyć matematyki
Fragment z powyższego linku:
// 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
to jakikolwiek przedmiot. Więc jeśli przekażesz zasięg globalny do funkcji evalute, możesz być w stanie wykonać alert () dynamicznie.
Również mathjs jest znacznie lepszą opcją niż eval (), ponieważ działa w piaskownicy.
Użytkownik może próbować wstrzyknąć złośliwy kod JavaScript za pośrednictwem parsera wyrażeń. Parser wyrażeń mathjs oferuje środowisko piaskownicy do wykonywania wyrażeń, które powinny to uniemożliwiać. Możliwe jest jednak, że istnieją nieznane luki w zabezpieczeniach, dlatego należy zachować ostrożność, szczególnie podczas zezwalania na wykonywanie po stronie serwera dowolnych wyrażeń.
Nowsze wersje mathjs nie używają funkcji eval () ani Function ().
Parser aktywnie zapobiega dostępowi do wewnętrznej oceny skryptów JavaScripts i nowej funkcji, które są główną przyczyną ataków bezpieczeństwa. Mathjs w wersjach 4 i nowszych nie używa eval JavaScript pod maską. Wersja 3 i starsze używały eval na etapie kompilacji. Nie jest to bezpośrednio kwestia bezpieczeństwa, ale skutkuje większą możliwą powierzchnią ataku.
Używanie zarówno funkcji eval, jak i tworzenia nowej funkcji do wykonywania javascript wiąże się z wieloma zagrożeniami bezpieczeństwa.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
Wolę tę metodę, aby wykonać JavaScript, który otrzymuję jako ciąg.