Javascript 可能的评估方法

Javascript 可能的评估方法,javascript,Javascript,我知道的是eval、Function和setTimeout。尽管引用没有提到可以使用字符串参数调用它,但我假设在这方面它的工作方式与setTimeout相同 在浏览器中,从字符串计算代码的可能方法(包括非标准方法)有哪些?在浏览器中,我只知道: eval 函数构造函数 setTimeout和相关(setInterval,非标准setImmediate) 创建脚本元素,设置其文本内容,并将其附加到文档中(通过DOM方法,或使用document.write或类似方法) 在链接上使用javascri

我知道的是
eval
Function
setTimeout
。尽管引用没有提到可以使用字符串参数调用它,但我假设在这方面它的工作方式与
setTimeout
相同


在浏览器中,从字符串计算代码的可能方法(包括非标准方法)有哪些?

在浏览器中,我只知道:

  • eval
  • 函数
    构造函数
  • setTimeout
    和相关(
    setInterval
    ,非标准
    setImmediate
  • 创建脚本元素,设置其文本内容,并将其附加到文档中(通过DOM方法,或使用
    document.write
    或类似方法)
  • 在链接上使用
    javascript:
    伪协议等(然后人工单击它们或邀请用户这样做)
    • Bookmarklets是这种方法的一个特例
  • DOM0事件处理程序(然后人工触发它们或邀请用户这样做)(很好的一个)
现场:

eval(“console.log('eval');”;
(0,eval)(“console.log(‘间接eval’);”;
新函数(“console.log('Function constructor');”)();
setTimeout(“console.log('setTimeout等”);”,0);
var script=document.createElement(“脚本”);
script.textContent=“console.log('script元素');”;
document.body.appendChild(脚本);
var link=document.createElement(“a”);
link.href=“javascript:console.log('javascript:pseudo protocol');”;
document.body.appendChild(链接);
link.click();
var div=document.createElement(“div”);
div.setAttribute(“onclick”、“console.log('DOM0事件处理程序”);”;
文件.正文.附件(div);
div.click();
/*或是长篇大论
div.dispatchEvent(新建鼠标事件(“单击”){
视图:窗口,
泡泡:是的,
可取消:正确
}));

*/
使用立即执行的非标准命令

<h1>

</h1>
<script></script>

$("script").html("(function(){$('h1').html('wow');})()");

$(“script”).html(((function(){$('h1').html('wow');})());

这里还有一种非标准的方法,目前还没有提到,那就是使用wkhtmltopdf,通过这种方法,wkhtmltopdf myjscode.html all.pdf,其中myjscode.html是用fopen/cat或以字符串为参数的东西生成的。当执行pdf时,javascript被执行(),javascript也在服务器端执行(是)。这似乎无关紧要,但对安全有着重大影响。如果我们要用wkhtmltopdf制作一个部分基于用户输入的pdf,我们需要记住这个问题

除了其他答案中提到的方法外,在浏览器中,您还可以执行以下操作:

document.write('<script>doSomething()</script>');

你到底想做什么?这个问题似乎太宽泛了。只是要一份清单。@T.J.Crowder我想是的。有很多方法可以在Node中实现这一点,但这并不重要,因为在这方面没有关注安全性。@zero298正如您所说,我想要一个列表。我没有试图解决任何特定的编码问题。这个问题不太宽泛,因为它包含了足够的细节,可以得到高质量的答案。我问这个问题的原因是,如果出于某种原因(DSL语言中的基本安全性、代码审查规则等),我必须列出这些方法,我可能无法将它们全部命名。模板文本、DOM事件处理程序中的嵌入代码,例如
onlick='alert(“Hello”)'
,等等@GOTO0-Gah,我错过了。我再加上。(模板文本实际上不在这里或那里,但属性样式的事件处理程序在这里或那里。)谢谢。虽然这些方法可能在内部使用已经列出的方法,但值得一提。
const script = document.createElement('script');
script.src = 'data:text/javascript,' + encodeURIComponent('doSomething()');
document.body.appendChild(script);