如何执行一些字符串的JavaScript?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
答案 0 :(得分:190)
答案 1 :(得分:110)
您可以使用功能执行它。例如:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
答案 2 :(得分:57)
eval
function将评估传递给它的字符串。
但使用eval
can be dangerous,请谨慎使用。
修改:annakata有一个好处 - 不仅eval
危险 ,它还是 慢 即可。这是因为必须在现场解析要评估的代码,因此需要一些计算资源。
答案 3 :(得分:20)
使用eval()。
W3 Schools tour of eval。网站有一些可用的eval示例。 The Mozilla documentation covers this in detail.
您可能会get a lot of warnings安全地使用它。 不允许用户将任何内容注入eval(),因为这是一个巨大的安全问题。
您还想知道eval()有不同的scope。
答案 4 :(得分:14)
试试这个:
var script = "<script type=\"text/javascript\"> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
我个人没有测试过,但似乎有用。
答案 5 :(得分:7)
有点像 @Hossein Hajizadeh alerady所说的,尽管更详细:
eval()
可以替代。
函数setTimeout()
用于在一毫秒的间隔后执行某些操作,并且要执行的代码恰好被格式化为字符串。
它会像这样工作:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
&#13;
1
表示在执行字符串之前会等待1毫秒。
这可能不是最正确的方法,但它确实有效。
答案 6 :(得分:5)
在许多复杂且混淆的脚本上检查了这一点:
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);
答案 7 :(得分:5)
如果要在a之后执行特定命令(即字符串) 特定的时间 - cmd =你的代码 - InterVal =延迟运行
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
答案 8 :(得分:5)
使用eval,如下所示。应该谨慎使用Eval,关于“eval is evil”的简单搜索应该引出一些指示。
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
答案 9 :(得分:3)
eval(s);
但是,如果您从用户那里获取数据,这可能会很危险,但我想如果他们自己的浏览器崩溃就会出现问题。
答案 10 :(得分:3)
new Function('alert("Hello")')();
我认为这是最好的方法。
答案 11 :(得分:2)
不确定这是否作弊:
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
答案 12 :(得分:2)
我正在回答类似的问题,并且还想到了如何在不使用eval()
的情况下实现这一目标:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
在上面的代码中,您基本上创建了包含脚本的Blob,以便创建Object URL(在浏览器内存中表示File或Blob对象)。由于src
标记上有<script>
属性,因此脚本的执行方式与从任何其他网址加载的方式相同。
答案 13 :(得分:2)
对于正在使用节点并且关心eval()
的上下文影响的用户,nodejs提供了vm
。它创建了一个V8虚拟机,可以在单独的上下文中沙箱化代码的执行。
更进一步的是vm2
,它使vm
变硬,从而使虚拟机可以运行不受信任的代码。
https://nodejs.org/api/vm.html-官方nodejs / vm
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.
答案 14 :(得分:1)
eval应该这样做。
eval(s);
答案 15 :(得分:1)
新功能和apply()一起工作
var a=new Function('alert(1);')
a.apply(null)
答案 16 :(得分:1)
function executeScript(source) {
var script = document.createElement("script");
script.onload = script.onerror = function(){ this.remove(); };
script.src = "data:text/plain;base64," + btoa(source);
document.body.appendChild(script);
}
executeScript("alert('Hello, World!');");
答案 17 :(得分:1)
同时使用eval和创建新函数来执行javascript comes with a lot of security risks.
=COUNTIF(A1:D1, "*VALUE1*") + COUNTIF(A1:D1, "*VALUE2*") + ... <0
我更喜欢这种方法来执行以字符串形式接收的Javascript。
答案 18 :(得分:0)
eval(s);
请记住,eval非常强大且非常不安全。您最好确信您正在执行的脚本是安全且不可由用户使用的。
答案 19 :(得分:0)
一个人可以使用mathjs
上面链接中的摘录:
// 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
是任何对象。因此,如果将全局范围传递给evalute函数,则可以动态执行alert()。
而且mathjs比eval()更好,因为它运行在沙箱中。
用户可以尝试通过以下方式注入恶意JavaScript代码: 表达式解析器。 mathjs的表达式解析器提供了一个沙盒 执行表达式的环境,这将使这不可能。 尽管存在未知的安全漏洞, 因此请务必小心,尤其是在允许服务器端 执行任意表达式。
较新版本的mathjs不使用eval()或Function()。
解析器主动阻止访问JavaScript的内部评估和 新功能是安全攻击的主要原因。数学 第4版及更高版本并未在后台使用JavaScript的eval。 版本3和更早的版本确实将eval用于编译步骤。这不是 直接导致安全问题,但可能导致更大的攻击 表面。
答案 20 :(得分:0)
使用字符串运行代码
function runMe(x,y,z){
console.log(x);
console.log(y);
console.log(z);
}
// function name and parameters to pass
var fnstring = "runMe";
var fnparams = [1, 2, 3];//<--parameters
// find object
var fn = window[fnstring];
// is object a function?
if (typeof fn === "function") fn.apply(null, fnparams);//<--apply parameter
enter code here
答案 21 :(得分:0)
Stefan's answer 的扩展:
//Executes immediately
function stringToFunctionAndExecute(str) {
let func = new Function(str);
return (func()); // <--- note the parenteces
}
//Executes when called
function stringToFunctionOnly(str) {
let func = new Function(str);
return func;
}
// -^-^-^- Functions -^-^-^- (feel free to copy)
// -v-v-v- Explanations -v-v-v- (run code to read easier)
console.log('STEP 1, this executes directly when run:')
let func_A = stringToFunctionAndExecute("console.log('>>> executes immediately <<<')");
console.log("STEP 2, and you can't save it in a variable, calling a() will throw an error, watch:")
try {
func_A();
} catch (error) {
console.log('STEP ERROR, see, it failed', error)
}
console.log('STEP 3, but this will NOT execute directly AND you can save it for later...')
let func_B = stringToFunctionOnly("console.log('>>> executes when called <<<')");
console.log("STEP 4, ...as you see, it only run when it's called for, as is done now:")
func_B();
console.log('STEP 5, TADAAAAA!!')