1

Cajaの論文によると:

禁止されている名前。Firefoxでは、オブジェクトの「__proto__」プロパティにアクセスすると、そのようなオブジェクトをさらに作成する権限が付与されます。これは、最小権限の原則に違反します。したがって、Cajaは「__」(二重アンダースコア)で終わるすべての名前を拒否します。これにより、Caja実装は、Cajaプログラマーには見えない場所に簿記情報を保存する場所も提供されます。

Firebugで試してみましたが、すべてのメソッド __proto__(つまり、pkcsll, atob, btoa, screenXなど)が表示されましたが、コピータイプのメソッドが表示されません。どのように__proto__悪用されますか?

4

2 に答える 2

3

彼らの言っていることがわからない限り__proto__、オリジナルの同じプロトタイプからさらにオブジェクトを作成する必要はありません。

これは、標準のecmascript5メソッドを使用して行うことができます。

function FooBar() {}
FooBar.prototype.foo = function() { return "bar"; };

 /* create a FooBar object */
var fb1 = new FooBar();



 /* using __proto__ this creates an object with the same prototype as fb1 */    
var fb2 = {};
fb2.__proto__ = fb1.__proto__;



 /* and so does this, but without __proto__ */
var fb3 = Object.create(Object.getPrototypeOf(fb1));



fb1 instanceof FooBar; // true
fb2 instanceof FooBar; // true
fb3 instanceof FooBar; // true
于 2012-05-06T00:35:05.753 に答える
2

正確にはエクスプロイトとは言いませんが、をサポートするJavaScriptエンジンでは__proto__、次のようにして、他のオブジェクトと同じプロトタイプでオブジェクトを作成できます。

function makeObjectLike(a) {
    function maker() { }
    maker.prototype = a.__proto__;
    return new maker();
}

Object.getPrototypeOf(a)の代わりにES5を使用して同じことを行うこともできますa.__proto__

Cajaは、本質的に悪いからではなく、ロードして実行しているコードを信頼しない場合に悪に使用される可能性があるため、禁止しています。この手法を使用することは、独自のコードで問題ありません(ブラウザーの互換性の問題を除く)。

于 2012-05-06T00:35:15.067 に答える