2012-01-26 4 views
0

편집 : 그냥 분명히 : 내 질문은 : 그것은 가능한 동적으로 페이지에있는 다른 모든 함수 호출 전에 함수를 삽입 할 수 있습니다.호출 사이에 함수를 호출

저는 모든 함수 호출 전에 하나의 함수 자체를 삽입하고 싶습니다. JS 앱에 대한 액세스 제어 목록을 구현하려고합니다. 그래서 예.

사용자 프레드 기능 app.addPage()에 액세스 할 수 있습니다,하지만 그는 그래서 지금은 게이트 키퍼 기능을 호출 한 후 의도 된 원래의 함수를 호출 어떻게 기능을 app.removePage();

에 액세스 할 수 없습니다?

나는 모든 메소드 호출은 다음과 같이 보이도록 내 응용 프로그램을 수정할 수 있습니다 가정 :

app.acl().functionCall(); 

하지만 일부 동적 방법으로 지금까지 함수 호출하기 전에 자동으로 acl()를 주입하고 싶었다. 가능한?

+0

Function.prototype.call = function() {console.log ('helloooo');}를 실행 한 후'alert ('tomato');의 동작에 대한 설명이 정확하지 않습니다. 그것을 감안할 때, 심지어 당신이 무엇을 요구 하는지를 말하기는 어렵습니다. –

+0

@Iburbur : 무슨 뜻인지 미안 해요? Chrome 콘솔 창에서 테스트 중이며 Function.prototype.call = function() {console.log ('hello')}을 추가하면 해당 페이지의 모든 함수 호출이 'hello'를 콘솔에 출력합니다. 그래서 예 : 경고 ('test')는 콘솔에 'hello'를 기록하는 경고를 표시하지 않습니다. 일부 기능을 사용하는 액세스 수준에 따라 페이지가 아닌 다른 페이지에서 실행할 수 있도록 게이트 키퍼 함수를 ​​작성하려고합니다. –

+0

@Eli_s는 로깅을하는'alert'가 아니고'.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

아, 잘 잡으세요. 대체하기 전에 원래 기능을 "저장"해야합니다. 내 코드를 업데이트했습니다. –

관련 문제