做eval的可能方法

时间:2018-05-11 17:07:34

标签: javascript

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

在浏览器中从字符串中评估代码的可能方式(包括非标准方法)是什么?

3 个答案:

答案 0 :(得分:5)

在浏览器上,我所知道的只有:

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

住:



eval("console.log('eval');");
(0,eval)("console.log('indirect eval');");

new Function("console.log('Function constructor');")();

setTimeout("console.log('setTimeout and such');", 0);

var script = document.createElement("script");
script.textContent = "console.log('script element');";
document.body.appendChild(script);

var link = document.createElement("a");
link.href = "javascript:console.log('javascript: pseudo-protocol');";
document.body.appendChild(link);
link.click();

var div = document.createElement("div");
div.setAttribute("onclick", "console.log('DOM0 event handler');");
document.body.appendChild(div);
div.click();
/* Or to be long-winded
div.dispatchEvent(new MouseEvent("click", {
  view: window,
  bubbles: true,
  cancelable: true
}));
*/




答案 1 :(得分:2)

使用立即执行的非标准

<h1>

</h1>
<script></script>

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

到目前为止,还有一种非标准的方法是使用wkhtmltopdf,这样wkhtmltopdf myjscode.html all.pdf,其中myjscode.html是用fopen / cat或者字符串作为参数生成的。当执行pdf时,执行javascript(https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/js_api_reference.pdf),同时javascript执行服务器端(是)。这似乎不相关,但它对安全性有重大影响。如果我们要根据wkhtmltopdf的用户输入进行pdf,我们会记住这个问题。

答案 2 :(得分:1)

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

document.write('<script>doSomething()</script>');
const script = document.createElement('script');
script.src = 'data:text/javascript,' + encodeURIComponent('doSomething()');
document.body.appendChild(script);