执行存储为字符串的JavaScript代码

时间:2009-06-02 12:54:37

标签: javascript

如何执行一些字符串的JavaScript?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

22 个答案:

答案 0 :(得分:190)

使用eval("my script here")功能。

答案 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()用于在一毫秒的间隔后执行某些操作,并且要执行的代码恰好被格式化为字符串。

它会像这样工作:

&#13;
&#13;
ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}
&#13;
&#13;
&#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变硬,从而使虚拟机可以运行不受信任的代码。

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!!')