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

Execute a string as a piece of HTML/javascript code

本文关键字:HTML 一段 javascript 执行 代码 字符串      更新时间:2023-09-26

所以,假设我在javascript中定义了一个字符串:

   var s = "function();"

如果我知道字符串的值,我可以执行代码吗?

如果是,那么我可以在一个字符串中有多个命令吗?例如:

   var k = "function(); a = a + 1;"

提前致谢

您可以使用

eval,是的,将执行多个语句。但是,使用eval通常是一个坏主意。在大多数情况下,您可能可以在没有eval的情况下完成您尝试做的任何事情。

如果与用户提供的代码(例如表单或 URL 中的某些内容)一起使用,eval可能会非常危险。它使您面临跨站点脚本 (XSS) 攻击。只是避免它是最好的做法,正如这个答案所提到的,在通过eval之前清理输入根本不是直截了当的,而且非常容易出错。

使用 eval 的其他几个不太重要的问题是它使代码难以调试并且速度很慢。这使得浏览器很难(如果不是不可能的话)像优化其他代码一样对其进行优化和/或缓存。

更新

我很惊讶我在最初回答这个问题时忽略了提到这一点,但明确使用 eval 语句并不是可以在 JavaScript 中调用eval的唯一方法。将代码而不是函数引用传递给setTimeoutsetInterval将隐式评估该代码。

// This evals:
setTimeout("doSomething()", 1000);
// This does not eval:
setTimeout(doSomething, 1000); // also shorter :)

虽然与eval不完全相同,但Function构造函数也有类似的安全问题。

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一样,当使用字符串作为setTimeoutsetIntervalFunction构造函数的输入时,应该小心,特别是当用户输入将被传递到它们中时。

另请参阅:

  • 邪恶是怎样的
  • 埃瓦尔不是邪恶的,只是被误解了
  • 为什么使用 JavaScript eval 函数是个坏主意?(这里有几个很好的答案)
  • 动态语言反击

您可以使用eval()来计算/执行 JavaScript 代码/表达式:

var k = "var a = 0; alert(a); a = a + 1; alert(a);"
eval(k);

eval 函数将计算传递给它的字符串。它很。这是因为要评估的代码必须当场解析,这样会占用一些计算资源。