背景: 私は、特定のサイトに使用されるフレームワーク/ライブラリに、グリースモンキー/ユーザー スクリプトと連携して取り組んでいます。このフレームワーク/ライブラリにより、アドオンのサポートが可能になります。それが機能する方法は、必要なページ、リソース、ectera をリストするライブラリにアドオンを登録することです。ライブラリは、アドオンのload()
関数を呼び出すためにすべての条件が満たされるまで待機します。
問題: この「必要なもの」のリストでは、アドオン開発者が「必要なリソース」として評価される javascript (文字列として) を指定できるようにしたいと考えています。たとえば'document.getElementById("banana")'
。私がやりたいのは、「必要なリソース」の評価をセミサンドボックス化して、評価がウィンドウとDOMオブジェクトにアクセスできるようにすることですが、それらを直接変更することはできません。また、サンドボックスから eval と evalJS にアクセスできないようにしたいと思います。
例:
document.getElementById("banana")
->有効document.getElementById("apple).id = "orange"
-> 無効window.grape
->有効window.grape = 'potato'
-> 無効(someObj.applesCount > 0 ? 'some' : 'none')
->有効
私がこれまでに持っているもの:
function safeEval(input) {
// Remove eval and evalJS from the window:
var e = [window.eval, window.evalJS], a;
window.eval = function(){};
window.evalJS = function(){};
try {
/* More sanition needed before being passed to eval */
// Eval the input, stuffed into an annonomous function
// so the code to be evalued can not access the stored
// eval functions:
a = (e[0])("(function(){return "+input+"}())");
} catch(ex){}
// Return eval and evalJS to the window:
window.eval = e[0];
window.evalJS = e[1];
// Return the eval'd result
return a;
}
注:
これは Greasemonkey/userscript です。サイトを変更するための直接アクセス権がないか、JavaScript です。
の入力はsafeEval()
、ウィンドウ オブジェクトまたは DOM を変更しない限り、DOM クエリまたは単純な評価など、任意の有効な JavaScript にすることができます。