使用 PhantomJS,您可以在浏览器中执行代码page.evaluate()
。如果我们允许用户指定可以在该浏览器上下文中执行的代码,我们是否会向攻击向量敞开大门?有没有办法从浏览器上下文逃到 phantomJS 环境,从而在我们的服务器上执行命令?
这是一个例子:
page.open(options.url, function(status) {
var test = function() {
return page.evaluate(function() {
return eval({{USER JAVASCRIPT STRING}});
});
});
var interval = setInterval(function() {
if (test()) {
clearInterval(interval);
// take screenshot, do other stuff, close phantom
}
}, 250);
});
据我了解,eval()
内部发生的事情page.evaluate()
可以防止它们逃离打开的页面的上下文。用户 javascript 字符串作为字符串传递(它不会“编译”成单个 javascript 文件)。在我看来,这与用户使用浏览器浏览网站并试图通过他们最喜欢的 Javascript 控制台破解并没有什么不同。因此,这种用法并不代表安全漏洞。这个对吗?
更新
为了更清楚地了解确切的用例。基本要点是有人会转到一个 URL,http: //www.myapp.com/?url=http: //anotherurl.com/&condition= {{javascriptstring}}。当一个worker可用时,它会启动一个幻像实例,page.open
提供的URL,然后当condition
遇到时,它会截取网页的屏幕截图。这样做的目的是,某些页面,尤其是那些具有大量异步 javascript 的页面,具有不像DOM ready
or那样简单的奇怪的“就绪”条件window ready
。这样,在 javascript 条件为真之前不会截取屏幕截图。示例包括$(".domNode").data("jQueryUIWidget").loaded == true
或$(".someNode").length > 0
。