javascript - 将字符串作为一段 HTML/javascript 代码执行

标签 javascript html

所以,假设我有一个用 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 referencesetTimeoutsetInterval将隐式评估该代码。

// 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 的输入时应小心, setIntervalFunction构造函数,尤其是当用户输入要传递给它们时。

另见:

关于javascript - 将字符串作为一段 HTML/javascript 代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36793058/

相关文章:

javascript - 使用 D3.js 创建嵌套的 HTML 结构

javascript - 将xlsx文件保存在变量中,然后点击下载?

python - 使用 BeautifulSoup 删除 td 元素之间/之后的空格

c# - PDF在IE中隐藏Jquery Modal

html - Vaadin:强制 CSS 容器在动画后适应全宽

html - 使用线性渐变向下滚动时淡化底部文本

javascript - Selenium Webdriver for 循环打开许多浏览器,不等待函数完成

javascript - 使用 try catch

JavaScript 以编程方式强制关闭选项卡?

javascript - javascript 中的下拉列表包含数据库中的值