我有一个编辑器,用户可以输入他们的javascript并显示他们的输出。但是我想要一个安全条件来阻止它们意外地创建一个无限循环。问题是我真的不想解析代码并寻找任何循环,然后添加额外的条件。我希望的是一个预先构建的函数,它可以在一定量的内存之后取消它,以避免浏览器崩溃。但我不确定如何做到这一点。
答案 0 :(得分:3)
JS BIN运行一个名为loop-protect
的开源项目,您可以使用它,它很容易实现。
答案 1 :(得分:1)
在JavaScript本身中没有通用的方法,因为浏览器中的JavaScript是单线程的。*如果“敌对”脚本永远不会产生,那么你的代码将无法获得机会run - 杀死用户的脚本。
在某些情况下,运行时可以为您执行此操作 - Internet Explorer因its obnoxious error messages而臭名昭着,但我不了解任何与平台无关的方法来请求此类环境保护。
*忽略与讨论无关的网络工作者,因为消息处理无论如何都发生在主“线程”中。
答案 2 :(得分:0)
最干净的解决方案可能是解释JavaScript。这就是http://repl.it的工作方式((http://repl.it/help)。),当您执行无限循环时,反馈非常好。var f=function(){f();};f();
会产生此输出:{{1 }}
JS-interpreter似乎是用Acorn JS解释JavaScript,你可能能够为无限循环添加检测:https://github.com/NeilFraser/JS-Interpreter
另一种选择是使用Web Workers(https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/basic_usage):
移动用户'使用服务器端的东西将脚本导入Web worker。您还可以使用此MDN示例中的数据URI:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Advanced_concepts_and_examples。但是,由于安全限制(http://caniuse.com/#feat=datauri),数据URI在IE中不起作用。
覆盖RangeError: Maximum call stack size exceeded
,console.log
或其他任何用户需要的内容,以便从脚本中获取反馈,以便将其转换为Web工作人员消息。
在预先设定的时间后杀死每个Web工作者。