2012-01-26 30 views
0

編集:私の質問です:動的に可能ですか? ページ上の他のすべての関数呼び出しの前に関数を挿入してください。呼び出し間の関数の呼び出し

すべての関数呼び出しの前に、1つの関数を注入することをお勧めします。 JSアプリケーションのアクセス制御リストを実装しようとしています。だから例えば。

ユーザfredは機能app.addPage()にアクセスすることができますが、彼は今、私はゲートキーパー機能を呼び出した後に意図されていた元の関数を呼び出すんどのようにapp.removePage();

機能にアクセスすることはできませんか?

は、私はすべてのメソッド呼び出しは次のようになりますように、私は私のアプリを変更することができたとします

app.acl().functionCall(); 

しかし、私はいくつかの動的な方法で、これまでの関数呼び出しの前に自動的にacl()を注入したかったです。可能?

+0

'alert( 'tomato');' Function.prototype.call = function(){console.log( 'helloooo');} 'の実行後の説明は正確ではありません。それを考えると、あなたが何を求めているかを伝えることさえ困難です。 –

+0

@Iburbur:どういう意味が分かりませんか?私はChromeのコンソールウィンドウでテストを行い、Function.prototype.call = function(){console.log( 'hello')}を追加すると、そのページのすべての関数呼び出しがコンソールに 'hello'を出力します。つまり、警告( 'test')はコンソールに「こんにちは」を記録するアラートを表示しません。私はいくつかの機能をページ上で実行できるようにするゲートキーパー機能を書こうとしていますが、アクセスレベルに応じて他の機能は実行しません。 –

+0

@Eli_sはロギングを行う警告ではなく、 '.call'を使用するコンソールです。 'alert( 'tomato')'は '.call'を使用しません – Esailija

答えて

0

クライアント側のアプリケーションでこの種のセキュリティコントロールを実行しようとしても無駄です。たとえば、Function.prototypeをオーバーライドすることができたとしても、特権を持たないユーザーは元の機能でそれをやり直すことができます。または、特権を持つように変数を変更します。または、POSTリクエストを作成して、スクリプトを完全にバイパスしてサーバーに直接送信してください。クライアントサイドのコードで実行しようとしていることを絶対に強制する方法はありません。

、しかし、あなたは利便ではなくセキュリティのためにこれをやっている場合は、この考えてみます。その最初のチェック機能を

// define your functions as usual 
app.showCatVideo = function (...) { /* ... */ }  
app.deletePage = function(...) { /* ... */ } 
app.dropBombs = function(...) { /* ... */ } 

// specify which ones are privileged 
var privilegedFunctionNames = [ "deletePage", "dropBombs" ]; 

for(var i = 0; i < privilegedFunctionNames.length; i++) { 
    var funcName = privilegedFunctionNames[ i ], 
    , origFunc = app[ funcName ]; 
    ; 

    delete app[ funcName ]; 

    // replace the function with this one 
    app[ funcName ] = function() { 
    // check the user 
    if(theUser.isPrivileged()) { 
     // call the original function with the arguments passed 
     return origFunc.apply(app, arguments); 
    } 
    else { 
     // hissy fit 
     alert("Unauthorized!"); 
    } 
    } 
} 

これはちょうどあなたが(privilegedFunctionNamesに)指定した関数をラップは、ユーザが特権を持っていて、s/heがそうであれば関数を呼び出し、そうでなければアラームを鳴らします。

私は言ったように、これはいいえセキュリティ上の利点があります。誰かがFireBugの使い方を知っていれば、他のクライアントサイドのトリックを打ち負かすことができます。

+0

ありがとうございます。はい、このアプローチは、セキュリティではなく便宜のためです。あなたの素晴らしいコードをありがとう...正確に私が探していたもの: –

+0

申し訳ありませんが、簡単な質問:app [funcName] = function(){...}は関数を上書きしません。次に、app [funcName] .apply(...)を返すと、元のものを呼び出すことがわかりますか? –

+0

ああ、良いキャッチ。元の関数を置き換える前に "保存"する必要があります。コードを更新しました。 –

関連する問題