Answers:
您可以使用函数执行它。例:
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
函数将评估传递给它的字符串。
但是使用eval
可能会很危险,因此请谨慎使用。
编辑: annakata有一个好处-不仅eval
危险,而且速度很 慢。这是因为要评估的代码必须在现场进行解析,这样会占用一些计算资源。
eval()
是危险的。还有其他选择吗?
使用eval()。
W3学校评估之旅。网站上有一些可用的评估示例。Mozilla文档对此进行了详细介绍。
您可能会收到很多有关安全使用此软件的警告。不允许用户向eval()注入任何内容,因为这是一个巨大的安全问题。
您还想知道eval()的作用域不同。
eval
比W3Schools文章对我的描述更好。具有良好解释和示例的可读性应该是developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。不,我不是bjorninge
有点像@Hossein Hajizadeh alerady所说的,尽管更详细:
有一个替代eval()
。
该函数setTimeout()
旨在在毫秒间隔后执行某些操作,而要执行的代码恰好被格式化为字符串。
它将像这样工作:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
表示它将在执行字符串之前等待1毫秒。
这可能不是最正确的方法,但它可以工作。
setTimeout
?请注意,无论如何,它将使执行异步。这意味着setTimeout
在调用之后的所有代码都将在传递给代码之前被调用setTimeout
(即使使用0(零)调用)。
如下使用eval。应谨慎使用eval,有关“ eval is evil ” 的简单搜索应抛出一些指针。
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
如果要在特定时间后执行特定命令(即字符串)-cmd =您的代码-InterVal =延迟运行
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
在InterVal
资本?
对于正在使用node并关心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.
eval(s);
但是,如果您从用户那里获取数据,这可能很危险,尽管我认为如果用户崩溃了,这就是他们的问题。
eval
从用户那里编写代码的网站,例如,该网站可能使用户窃取其他用户的帐户而使他们仅通过加载页面就不知道。
不知道这是否在作弊:
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
New Function和apply()一起也可以工作
var a=new Function('alert(1);')
a.apply(null)
我在回答类似的问题,但又有了另一个想法,如何不使用以下方法实现此目的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,以便创建对象URL(浏览器内存中File或Blob对象的表示形式)。由于您src
在<script>
标签上具有属性,因此脚本的执行方式与从任何其他URL加载脚本的方式相同。
评估应该做到这一点。
eval(s);
eval(s);
但是请记住,该评估功能非常强大且非常不安全。您最好确信所执行的脚本是安全的,并且不会被用户更改。
一个可以使用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内部eval和新Function的访问,这是安全攻击的主要原因。Mathjs 4版及更高版本并未在后台使用JavaScript的eval。版本3和更早的版本确实将eval用于编译步骤。这不是直接的安全问题,但会导致更大的攻击面。
同时使用eval和创建新函数来执行javascript 会带来很多安全风险。
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
我更喜欢这种方法来执行以字符串形式接收的Javascript。