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 コンソールからハッキングしようとするのと同じように思えます。したがって、この使用法はセキュリティ上の脆弱性を表すものではありません。これは正しいです?
アップデート
正確なユースケースについてもう少し明確にするため。基本的な要点は、誰かがhttp://www.myapp.com/?url=http://anotherurl.com/&condition= {{javascriptstring}} という URL にアクセスすることです。ワーカーが利用可能になると、指定されpage.open
た URLでファントム インスタンスが起動され、指定された URLcondition
に到達すると、Web ページのスクリーンショットが取得されます。これの目的は、一部のページ、特に大量の非同期 JavaScript を含むページに、DOM ready
またはほど単純ではない奇妙な「準備完了」条件があることwindow ready
です。この方法では、javascript 条件が true になるまでスクリーンショットは取得されません。例には、$(".domNode").data("jQueryUIWidget").loaded == true
またはが含まれます$(".someNode").length > 0
。