クライアント側のアプリでそのようなセキュリティ制御を実行しようとするのは無駄です。たとえば、特権のないユーザーをオーバーライドできたとして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の使用方法を知っている場合、彼らはあなたが思いつく可能性のある他のクライアント側のトリックを打ち負かす途中です。