3

「ウィンドウ」または「ドキュメント」オブジェクトを置き換える方法はありますか?私が基本的に望んでいるのは、ある種のJavaScriptプロキシを提供することです。ユーザーがページ上に「いくつか」(一部のみ!これは重要です)のDOM要素を取得しないようにします。「ユーザー」とは、3番目のパティスクリプトを意味します。

私がすることができます:

document.getElementsByTagName("a")
//NodeList[129]
document.getElementsByTagName = function(){}
//function (){}
document.getElementsByTagName("a")
//undefined

しかし、document.allDOMオブジェクトフィールドを置き換えて、DOM要素の「一部」のみを返すようにするにはどうすればよいですか?

UPD:'document'オブジェクトをJavaScriptオブジェクトに置き換える方法がある場合、これははるかに優れています

UPD2:あなたのメソッドが「古い」ブラウザで動作しないかどうかは気にしません。だから私は「A」の採点者で動作するすべてのソリューションで良いです

UPD3:JavaScriptには100%のセキュリティが存在しないことを知っています。ハッカーが「ハッキング」するのを防ぎたくありません。それは不可能です。開発者が、私の「自家製」に「プラグイン」を書くのを防ぎたいのです。フレームワーク、愚かなことをするために..

UPD4:わかりました、ドキュメントもウィンドウも置き換えることはできませんが、少なくとも「DOM」要素を返すために応答するすべての「フィールド」または「関数」を置き換えることはできますか?「document.getElementById」や「document.all」のように?

UPD5:ユーザー@pebblが私が欲しいものに「近い」何かを提案した

function a(window, document){
   /// in here window and document should be numerics
   alert(window);
   alert(document);
}

a(123,456);

しかし、彼の解決策には1つの大きな問題がありますhttp://jsfiddle.net/kRLax/

UPD6-7:これは「完璧な」ものです(少なくとも私にとっては)

http://jsfiddle.net/kRLax/12/

function Fx(){return function(){}}
function SafeThis(that){ 
    if (that == window) {
        return fakeWindow;
    } else if (that = document) {
        return fakeDocument;                    
    } else {
        return that;
    }
}
var fakeDocument = {
    write: function(a){ document.write(a) }
}
var fakeWindow = {
    document: fakeDocument
}

var moduleA = function(Function, window, document, eval){
    document.write(window + "<br>");
    var f = new Function("return this");
    document.write(f() + "<br>");
    var win = (function(){return this;})();
    document.write(win + "<br>");
    var e = eval("this"); 
    document.write(e + "<br>");
    document.write(this + "<br>");
    document.write(window + "<br>");
    document.write(document + "<br>");
    this.a = 1;
    document.write(JSON.stringify(this));
};

var moduleA_Fx = '!' + 
    moduleA.toString().replace(/\bthis\b/g,"SafeThis(this)") + 
    '(Fx,fakeWindow,fakeDocument,Fx)';

document.write(moduleA_Fx + "<br><br>");

eval(moduleA_Fx);
​
4

3 に答える 3

1

再割り当てできるのは書き込み可能なプロパティのみであるためdocumentwindowテーブルから外れています。

于 2012-11-22T18:44:31.430 に答える
1

グローバルプロパティは"document"書き込みも構成もできないため、できません。

// try this in global code
Object.getOwnPropertyDescriptor( this, 'document' ).writable // false
于 2012-11-22T18:45:51.377 に答える
1

次のことができますが、関数のスコープ内で外部スクリプトを評価する必要があります。

function a(window, document){
  /// in here window and document should be numerics
  alert(window);
  alert(document);
}

a(123,456);

または、サーバー側プロキシがある場合は、ラッパー化されたanon関数を使用してコードを書き直し、プロキシドキュメントとウィンドウオブジェクトを呼び出すことができます。

;(function(window, document){

  /// the unknown external code here.

})(windowProxy, documentProxy);

ただし、JS環境によっては次のものを使用できる可能性があるため、これを回避する方法はまだあります。

var win = (function(){return this;})();

他のコレクションにアクセスできないようにするために、他のコレクションを含める必要がある場合もあります。

;(function(window, document, all, images, ...){ ... }

ただし、documentアクセスを許可したdom要素を介してオリジナルにアクセスすることもできます...

UPD6に関して

便利な場合に備えて、次の穴を塞ぐこともできます。

  • setTimeout
  • setInterval

上記の両方を使用してコードを評価できます。

setTimeout('(function(){alert('+'th'+'is'+');})()');

さらに、公開しているdocument.writeので、これも実行可能です。

document.write(
  '<img src="data:image/gif;base64,ERROR" '+
     'onerror="alert(th'+'is.ownerDocument);" />'
);

また、アクセスをブロックSafeThisし、ターゲットコードでの言及を書き直す必要があります。そうしないと、オーバーライドできます。

SafeThis = function(that){return that;}

それ以外はかなり安全そうですが。十分に努力すれば、他の方法もあると思いますが、実際には、攻撃者の可能性があるとどの程度判断しているかによって異なります;)

于 2012-11-22T18:49:22.837 に答える