我所知道的是eval
,Function
和setTimeout
。尽管setImmediate
引用没有提到可以使用字符串参数调用它,但我认为它在这方面的工作方式与setTimeout
相同。
在浏览器中从字符串中评估代码的可能方式(包括非标准方法)是什么?
答案 0 :(得分:5)
在浏览器上,我所知道的只有:
eval
Function
构造函数setTimeout
及相关(setInterval
,非标准setImmediate
)document.write
或类似方法)javascript:
伪协议(然后以人为方式点击它们或邀请用户这样做)
住:
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);