2012-10-09 8 views
0

브라우저에서 javascript를 실행하면 소스 코드를 다운로드하여 볼 수 있기 때문에 기능 코드를 시도하거나 숨길 필요가 없습니다.Node.js가 기능 검사 (toString)를 방지합니다

서버에서 실행하면 상황이 변경됩니다. 실행중인 코드를 볼 수 없게 호출 할 함수를 사용자에게 제공하려는 api와 같은 사용 사례가 있습니다.

특정 경우에 사용자가 제출 한 javascript를 노드 내부에서 실행하려고합니다. 우리는 sandbox node.js api에 접근 할 수 있지만 사용자가이 코드를 볼 수있는 toString 함수를 사용하지 않고도이 샌드 박스에 우리 자신의 API를 추가하고 싶습니다.

패턴 코드가 있거나 사용자가 기능 코드를 출력하지 못하도록하는 방법을 알고 있습니까?

업데이트 : 여기

아래 허용 대답에 따라 전체 솔루션 (내가 생각)입니다. 이것이 클라이언트 측 코드를 사용하여 시연 되더라도 유의하십시오. 이 아닌은 다운로드 한 코드를 읽음으로써 숨겨진 기능의 내용을 볼 수 있기 때문에이 클라이언트 측을 사용합니다 (축소판을 사용한 경우 코드를 검사 할 때 약간의 속도 저하가 있음).

사용자가 샌드 박스 환경 내에서 API 코드를 실행하도록 허용하지만 API가 수행하는 내용을 볼 수 없도록하려는 서버 측 용도로 사용됩니다. 이 코드의 샌드 박스는 요점을 설명하기위한 것입니다. 실제 샌드 박스 구현은 아닙니다. 당신이 함수에 콜백을 포장하는 경우

// function which hides another function by returning an anonymous 
// function which calls the hidden function (ie. places the hidden 
// function in a closure to enable access when the wraped function is passed to the sandbox) 
function wrapFunc(funcToHide) { 
    var shownFunc = function() { 
    funcToHide(); 
    }; 
    return shownFunc; 
} 

// function whose contents you want to hide 
function secretFunc() { 
    alert('hello');    
} 

// api object (will be passed to the sandbox to enable access to 
// the hidden function) 
var apiFunc = wrapFunc(secretFunc); 
var api = {}; 
api.apiFunc = apiFunc; 

// sandbox (not an actual sandbox implementation - just for demo) 
(function(api) { 
    console.log(api); 
    alert(api.apiFunc.toString()); 
    api.apiFunc(); 
})(api); 

답변

4

, 당신은 따라서, 실제로 콜백 범위에서 숨겨진 그 범위에 다른 기능을 사용할 수 있습니다

function hideCall(funcToHide) { 
    var hiddenFunc = funcToHide; 
    var shownFunc = function() { 
     hiddenFunc(); 
    }; 
    return shownFunc; 
} 

그런 다음 thusly 히

var shtumCallBack = hideCall(secretSquirrelFunc); 
userCode.tryUnwindingThis(shtumCallBack); 
을 실행

userCode 범위는 사용할 수없는 hideCall 함수의 범위이기 때문에 호출하는 것 외에는 secretSquirrelFunc에 액세스 할 수 없습니다.

+0

호기심에서 벗어나서 toString을 (를) 덮어 쓰지 않는 이유는 무엇입니까? 'foo.toString =() => {}' – Kousha

+0

@Kousha : 수신 한 객체의 toString 메소드를 다시 설정할 수 있기 때문에'secret.toString = secret.constructor.prototype.toString'을 호출하십시오. –

관련 문제