4

Firefox拡張機能のソースコードを読んでいて、次のような表現を見ました。

0*this;

この表現は何かを意味しますか?

ps:私は中国語です。英語に何か問題があれば、教えてください、ありがとう!

これが拡張機能の機能です。

function inGetter(){
   0*this;
   var gin=  Components.lookupMethod(this,"innerHTML")();
   gin=String.newTainted(gin,"divElement.INNERHTML");

   if(__domIntruderObj.settings.enabled  )
      __domIntruderObj.log("Getter",this.tagName+".value",gin, __domIntruderObj.util.getCallStack(arguments));
   return gin;
}
4

3 に答える 3

2

グローバル実行コンテキストでのの値thisは、グローバルオブジェクトです。関数コンテキストでは、任意のオブジェクト、または厳密モードでは、未定義を含む任意の値を指定できます。

したがって、最初にToPrimitive(次にDefaultValuethisを呼び出す)を使用してプリミティブ値に変換され、結果はToNumberを使用して数値に変換されます。これらすべての結果は、数値またはNaNのいずれかになります。

したがって、の結果は、数値に変換されるか、それぞれに変換されるかに応じて、またはの0*thisいずれかになります。0NaNthisNaN

于 2012-12-18T03:29:36.057 に答える
2

このコードは、XSS検出Firefox拡張機能の一部です。

別の回答で述べたように、乗算はエンジンの内部DefaultValueメソッドの呼び出しを引き起こします。何が起こるか:それは試行valueOftoString、エラーをスローする前に。例えば、

2 * { valueOf: function () { return 3; }} // 6
2 * { toString: function () { return '4'; }} // 8
2 * { toString: function () { return this; }} // TypeError

したがって、この副作用を使用して、オブジェクトに関する情報を取得できます。特に、コードにはカスタムtoString実装がいくつかあります。これは、コールスタックログを生成するために使用されると思います。しかし、私は実際には詳細には触れていません。

于 2012-12-18T04:43:12.457 に答える
1

私が見る唯一のトリッキーな部分は次のとおりです。

typeof 1 => "number"
0*1 =>  0

typeof null => "object"
0*null => 0

それ以外の場合、結果は次のようになりますNaN

これも興味深いアプローチbwを持っています

typeof NaN => "number"

nullしかし、まさにここで、これはすべての数値と他のタイプを分類する賢い方法だと思います。

于 2012-12-18T03:32:17.010 に答える