在调用之间注入函数

Inject function between calls

本文关键字:函数 注入 之间 调用      更新时间:2023-09-26

编辑:只是要明确一点:我的问题是:有可能动态地在页面上的所有其他函数调用之前注入一个函数。

我希望单个函数在所有函数调用之前注入自己。我正在尝试为JS应用程序实现访问控制列表。例如

用户fred可以访问app.addPage()功能,但不能访问app.removePage(); 功能

那么,现在我该如何在调用看门人函数之后调用原始函数呢?

我想我可以修改我的应用程序,使每个方法调用看起来像这样:

app.acl().functionCall();

但我想在函数调用之前以某种动态方式自动注入acl()。可能的

试图在客户端应用程序中施加这种安全控制是徒劳的。即使你可以,比如说,覆盖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,他们已经成功击败了这一点——你可以想出的任何其他客户端技巧。