2017-07-30 8 views
1

次の関数が 'this'要素を設定して配列セルをフェッチする方法を知りたいですか?お願いします。JavaScriptセキュリティの問題

//my secure code 
 
var priv = ['item-0','item-1']; 
 
var api = {push: function(x){priv.push(x)}} 
 

 
api.store = function(i,x){priv[i] = x} 
 

 
//the attaker script 
 
var result; 
 
api.store('push',function(){result = this[0]}); 
 
api.push(); 
 

 
//the result is cell 0 of private array 
 
//how? 
 
//if i change the 'push' parameter then the result is empty! 
 
document.write(result)

+0

'this'キーワードは、文脈によって異なる意味を持つかもしれません。 'result'変数はどこにも宣言していないので、デフォルトではグローバルスコープを持っています。そのため、関数の外で利用できるようになります。あなたの問題の詳細を教えてください。 – CROSP

+0

@クリスプ私はいくつかの重要なコンテンツを持っています。私はそれらを安全に保ちたいと思います。 私の友人の1人が私にこのコードを送ってきました。私は彼が私のAPIオブジェクトを使ってプライベート変数にアクセスできることを知っています。 – easa

+0

@easa攻撃者が同じ環境で任意のコードを実行できる場合は、通常、すでに失われています。あなたは何を正確に保護しようとしていますか? – Bergi

答えて

4

何が起こるかというとapi.store('push',function(){result = this[0]});priv配列のpushメソッドをオーバーライドしていることです。つまり、この行の後にpushは、もはやjavascriptがネイティブに提供するpushメソッドではなく、攻撃者のカスタム関数であるfunction(){result = this[0]}です。今、api.push()に電話すると、それはオーバーライドされたpriv.push(x)を呼び出します。オブジェクトに対してpushが呼び出されているので、オブジェクトにはthisがバインドされています。これはpriv(詳細はin the MDN article on this)です。したがって、result = this[0]result = priv[0]に等しく、結果には最初の配列エントリが含まれます。

+0

どのようにオーバーライドされたのか分かりません。どの行?どうやって? – easa

+0

'api.store( 'push'、function(){result = this [0]});' api.store = function(i、x){priv [i] = x} 'を呼び出します。ここで、「i」はプッシュであり、xは攻撃者が通過した関数です。つまり、priv.push = function(){result = this [0]} 'に等しい' priv ["push"] = function(){result = this [0]} ' 'push'メソッドをオーバーライドします)。 –

+0

ダニエルありがとう:-) – easa

関連する問題