Внедрить функцию между вызовами - PullRequest
0 голосов
/ 27 января 2012

Редактировать: просто чтобы прояснить: Мой вопрос: возможно ли динамическое внедрение функции до вызова всех остальных функций на странице.

Я бы хотел, чтобы одна функцияВнедрить себя перед всеми вызовами функций.Я пытаюсь реализовать списки контроля доступа для приложения JS.Так, например.

Пользователь fred может получить доступ к функции app.addPage(), но он не может получить доступ к функции app.removePage();

Так как же теперь вызвать исходную функцию, которая была предназначена после вызова функции привратника?

Полагаю, я мог бы изменить свое приложение так, чтобы каждый вызов метода выглядел так:

app.acl().functionCall();

Но я хотел внедрить acl() автоматически перед вызовом функции каким-либо динамическим способом.Возможно ли это?

1 Ответ

0 голосов
/ 27 января 2012

Попытка установить такой контроль безопасности в клиентском приложении бесполезна. Даже если бы вы могли, скажем, переопределить 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, он на полпути к победе над любым другим трюком на стороне клиента, который вы можете придумать.

...