所以,假设我有一个用 javascript 定义的字符串:
var s = "function();"
如果我知道字符串的值,我可以执行代码吗?
如果是,那么我可以在一个字符串中包含多个命令吗?例如:
var k = "function(); a = a + 1;"
提前致谢
最佳答案
您可以使用 eval
, 是的,将执行多个语句。 但是,使用 eval
通常不是一个好主意. 在大多数情况下,您可以在没有eval
的情况下完成您想要做的任何事情。 .
eval
如果与用户提供的代码一起使用,例如来自表单或 URL 的代码,可能会非常危险。它打开你 Cross-Site Scripting (XSS) attacks .避免它是最好的做法,因为this answer提到,在通过 eval
之前对输入进行 sanitizer 一点也不直接,而且很容易出错。
使用 eval
的其他一些不太重要的问题是它使代码难以调试并且速度很慢。这使得浏览器很难甚至不可能像处理其他代码一样对其进行优化和/或缓存。
更新
令我惊讶的是,当我最初回答这个问题时却忽略了这一点,而是明确使用了 eval
声明不是唯一的方式eval
可以在 JavaScript 中调用。路过code instead of a function reference至 setTimeout
或 setInterval
将隐式评估该代码。
// This evals:
setTimeout("doSomething()", 1000);
// This does not eval:
setTimeout(doSomething, 1000); // also shorter :)
虽然与eval
不完全相同, Function
constructor还有similar security concerns associated with it .
let xss = 'alert("XSS")';
// whatever is in the string passed to Function
// becomes the body of the function
let doSomething = new Function(xss);
document.querySelector('button').addEventListener('click', doSomething, false);
<button>Do Something</button>
与 eval
一样, 使用字符串作为 setTimeout
的输入时应小心, setInterval
或 Function
构造函数,尤其是当用户输入要传递给它们时。
另见:
关于javascript - 将字符串作为一段 HTML/javascript 代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36793058/