2

私は Caja について学んでいますが、「これ」を盗むという概念について混乱しています。

Caja が対処するもう 1 つのセキュリティ上の脆弱性は、「this」盗用と呼ばれます。オブジェクトのクライアントがオブジェクトの状態にメソッドを追加して、オブジェクトの「this」に別名を付けることができる場合、前述の保護された「this」ルールは適用されません。

次に、次のコンストラクターを示します。

function Cell(value) {
  this.x_ =  "secret";
  this.value = value;
}

"x_" に関する隠れたリークがあります:

次のコードは、式でその秘密の値を明らかにすることができます。

(new Cell(
  function (){
    return this.x_;
  })).value()

これはどのように作動しますか?なぜそんな問題が?ヒントやアドバイスをいただければ幸いです。

4

1 に答える 1

2

単純化します:

(new Cell( )).value()

Cell コンストラクターから新しいオブジェクトを作成し、すぐにその value メソッドを呼び出しています。もちろん、value メソッドはまだ何も実行していません。ここで、次の部分が登場します。

function (){ 
  return this.x_; 
}

valueこれは、パラメーターとしてコンストラクターに渡すものです。この関数はthis.value、Cell コンストラクター内で割り当てられます。

したがって、Cell コンストラクターは効果的に次のようになります。

function Cell(value) {
  this.x_ =  "secret";
  this.value = function (){ 
    return this.x_; 
  };
}

では、Cell から新しいオブジェクトを作成し、そのvalueメンバーを呼び出すとどうなるでしょうか? 内部からの関数は Cell オブジェクトのx_値を返すため、秘密のテキストが明らかになります。

于 2012-04-28T04:56:47.707 に答える