0

編集:明確にするために:私の質問は:ページ上の他のすべての関数呼び出しの前に関数を動的に挿入することは可能ですか?

すべての関数呼び出しの前に、単一の関数がそれ自体を注入するようにしたいと思います。JSアプリのアクセス制御リストを実装しようとしています。だから例えば。

ユーザーfredは関数にアクセスできますapp.addPage()が、関数にアクセスできませんapp.removePage();

では、ゲートキーパー関数を呼び出した後に意図された元の関数を呼び出すにはどうすればよいですか?

すべてのメソッド呼び出しが次のようになるようにアプリを変更できると思います。

app.acl().functionCall();

acl()しかし、動的な方法で関数呼び出しを行う前に、自動的に注入したかったのです。可能?

4

1 に答える 1

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これは、(で)指定した関数を、ユーザーに特権があるかどうかを最初にチェックし、特権がある場合は関数を呼び出し、特権がない場合はアラームを鳴らす関数でラップするだけです。

ただし、私が言ったように、これにはセキュリティ上の利点はありません。誰かがFireBugの使用方法を知っている場合、彼らはあなたが思いつく可能性のある他のクライアント側のトリックを打ち負かす途中です。

于 2012-01-27T00:27:46.543 に答える