2016-04-26 5 views
0

私はあるコード(A)が何らかの種類のトークンを生成し、それを他のコード(B)に渡す方法を探していますコードを傍受できません(E)。安全にトークンを関数間で渡す

この質問では、Aがトークンを安全に生成できると仮定します。

Bが、トークンを含むオブジェクトを引数の1つとして受け取るAにいくつかの関数Fを公開する場合、Aはそのトークンを直接渡すことができます。

しかし、Eは、たとえば、console.logを上書きしてスタックを調べることによってこのトークンを見つけることができます。

var x = console.log 
console.log = function Eve() 
{ 
    x.apply(this, arguments); 
    console.info(Thing.caller.arguments); 
} 

(Fはもちろんのconsole.logを起動すると仮定して、実際には、このように上書きされる可能性が十分な機能があります)

私は削除することである、私はこれに対する緩和策があると思います潜在的に侵害された機能を呼び出す前に、渡されたオブジェクトからトークンを保護します。 即ち

var y = function Y(Secure) 
{ 
    var Thing = Secure.Arg; 
    delete Secure.Arg; 
    console.log('SomeMessage', arguments) ; 
} 
y({Arg:'SomeArg'}) 

(FFで少なくとも)スタック上argumentsオブジェクトが現在空のオブジェクトが含まれているので、オブジェクトの引数は、スタック上の値を変更操作します。 Eが渡されたデータにアクセスできる他の方法はありますか? はいの場合、これらの方法を緩和するか、より良いセキュリティで他のオプションを検討する必要がありますか?

EDIT for Clarity:Eは、AまたはBのコントロールの外側にある手段で注入されます。 Greasemonkeyのユーザースクリプト

+0

私はあなたがこの他の解決策を避けるために悪い時を過すと思います。異なる起点のiframeの内部で実行します。 –

答えて

2

あなたがスタックからプライベートデータを保持するために、実行一度ゲッターとクロージャを使用することができます。

function A(secret){ 
    return function(){ 
     var s=secret; 
     secret=null; 
     return s; 
    }; 
} 

function B(fn){ 
    var v=fn(); 
    console.log(fn); 
    alert("In B(): " + v); 
} 

var x=A(123); //give secret number to A, getting back a function 
alert(x); // no secret here 

B(x); // extract the secret by executing a one-time getter 
alert(x); // no secret here 

alert(x()); // still no secret, it's used-up 

JSはrefはセキュリティを提供削除、参照ベースのセキュリティを使用しているため。

また、引数値を取得するためにブレークポイントを設定できますが、try/catch、console.log()やその他のユーザランドトリックを使用して、AとBの中間の123をリカバリすることはできません上のコード。

値を取得するには関数を実行する必要があり、関数を実行すると値が破棄されます。

OPのコードが使用するオブジェクトプロパティの問題は、例外が発生した場合に秘密の値がオブジェクトに表示されますが、クロージャはその秘密を保持します。

+0

は、この創造的な解決策に投票しました。トークンを傍受するにはまだ関数Bにフックするかもしれませんが? – Roberto

+1

@ロベルト:私はどのように見えませんが、あなたはダムゲッターをよりスマートにすることができます。非厳密では、 'function tell(){alert(Function.prototype.toString.call(arguments.callee.caller));}のクールなトリックさえあります。function coolName(){tell(); } coolName(); 'これにより、tell()は何が呼び出されているかを正確に伝え、必要に応じてコードを検証します。多分MD5? – dandavis

+0

悪意のあるコードがあなたの前に関数Bを定義していて、 'Function.prototype.toString =()=> 'asd'を上書きすることもできます。 –

1

悪意のある目的で自分のコードを上書きする可能性のある第三者のライブラリを使用しているのであれば、既にご了承ください。だから最善の解決策は別の信頼できるものを使うことです。

これらのライブラリからトークンを保護したい場合は、書き込み不可能の機能をObject.definePropertyと定義することができます。

var obj = {}; 
Object.defineProperty(obj,'unwritableMethod',{ 
    value: function(token){ 
     //do stuff with this token 
    }, 
    writable: false 
}); 
var x = obj.unwritableMethod; 
var maliciousMethod = function Eve() 
{ 
    x.apply(this, arguments); 
    console.info(Thing.caller.arguments); 
}; 
// This will be silently ignored. 
obj.unwritableMethod = maliciousMethod; 
//you can test the result with this 
console.log(obj.unwritableMethod === maliciousMethod); //false 
関連する問題