(編集この回答は、編集前の質問に関連しています。Javascript を使用して実装されたスクリプト言語を知りませんが、いくつかあると思います。たとえば、ある時点で誰かが Javascript 用の BASIC を作成しました (以前はリンクがありましたが、したがって、この回答の残りの部分はかなり学術的なものですが、議論、説明、さらには注意の目的のために残しました. また、ボビンスのポイントに完全に同意し ます—これを自分で行わないでください, 作業を使用してくださいCajaなどの他のもの。)
ユーザーが生成したコンテンツでスクリプトを許可する場合は、保護メカニズムの穴を見つけて悪用する人々の軍拡競争に参加し、それらの悪用に対応するという事実に備えてください. 私はおそらくそれを避けると思いますが、あなたはあなたのコミュニティと虐待に対処するための選択肢を知っています. したがって、その準備ができている場合:
window
Javascript がシンボル解決を行う方法のため、 、document
、ActiveXObject
、XMLHttpRequest
、および同様のものが通常の意味を持たないコンテキストでスクリプトを評価できるように思われます。
// Define the scoper
var Scoper = (function() {
var rv = {};
rv.scope = function(codeString) {
var window,
document,
ActiveXObject,
XMLHttpRequest,
alert,
setTimeout,
setInterval,
clearTimeout,
clearInterval,
Function,
arguments;
// etc., etc., etc.
// Just declaring `arguments` doesn't work (which makes
// sense, actually), but overwriting it does
arguments = undefined;
// Execute the code; still probably pretty unsafe!
eval(codeString);
};
return rv;;
})();
// Usage:
Scoper.scope(codeString);
(今は悪を使用していますeval
が、を使用せずにクロスブラウザーのデフォルトオブジェクトをシャドウする方法をすぐには考えられませeval
ん。とにかくコードをテキストとして受け取っている場合...)
しかし、それは機能しません。これは部分的な解決策にすぎません (詳細は以下を参照)。コード内で(たとえば)codeString
アクセスしようとすると、グローバルではなくローカル変数にアクセスするというロジックがあります。他の人も同じです。残念ながら、シンボルが解決される方法により、 のプロパティは接頭辞 (たとえば )の有無にかかわらずアクセスできるため、それらもリストする必要があります。これは長いリストになる可能性があります。特に、bobince が指摘しているように、IE は名前または ID を持つ任意の DOM 要素を. したがって、おそらくこれをすべて独自の iframe に配置する必要があるため、その周りでエンドランを行うことができますwindow
window
window
window.
alert
window
問題と「のみ」は、標準のものに対処する必要があります。scope
また、関数をオブジェクトのプロパティにした方法にも注意してください。その後、プロパティを介してのみ呼び出します。これでインスタンスthis
に設定されScoper
ます (それ以外の場合、生の関数呼び出しではthis
デフォルトでwindow
! になります)。
しかし、ボビンスが指摘するように、物事を達成する方法は実にたくさんあります。たとえば、次のコードはcodeString
上記の監獄をうまく破ることができます。
(new ('hello'.constructor.constructor)('alert("hello from global");'))()
さて、jailを更新してその特定のエクスプロイトが機能しないようにすることもできます (すべてconstructor
の組み込みオブジェクトのプロパティをいじり ます) が、私はそれを疑う傾向があります。できれば、誰か (ボブのような人) が次のような新しいエクスプロイトを考え出すでしょう:
(function(){return this;})().alert("hello again from global!");
したがって、「軍拡競争」。
これを行うための唯一の完全な方法は、適切な Javascript パーサーをサイトに組み込み、そのコードを解析して不正なアクセスをチェックしてから、コードを実行させることです。大変な作業ですが、ユースケースがそれを正当化する場合...