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);