2012-03-30 1 views
0

안전하지 않을 수있는 코드를 실행해야하는 노드 서버를 구축하고 있습니다. 이것을 달성하기 위해 공격을 차단하고 결과와 스크립트의 결과를 반환하는 Sandbox API를 사용합니다. 수정 된 전역 객체를 사용하여 Node 전역 객체에서 숨겨진 액세스를 유지합니다 (또한 require ... 등 사용).다른 노드 프로세스로 객체를 전송하는 코드를 어떻게 동적으로 생성합니까?

내 특정 요구 사항은 사용자가 정의한 개체를 사용하는 것입니다 (이 모든 것이 신뢰할 수 있고 인터넷의 임의 사용자가 제공하지 않으므로 보안은 현재 가장 큰 걱정거리가 아닙니다. 그것은 작동합니다) 안전한 실행을 위해 하위 노드 프로세스에 코드와 함께 객체를 "전송"하는 동적 비트 (dynamic bit) 코드를 작성하십시오. 여기서 보안은 모든 오류가 주 프로세스를 손상시키지 않도록하기위한 것입니다.

나의 현재 목표는 같은 개체를 취할 않습니다 :

obj = { 
    defaultName: "Unnamed", 
    hello: function(name) { 
    if (typeof name === "undefined" || name === null) 
     name = this.defaultName; 
    echo("Hello, " + name + "!"); 
    } 
} 

나뿐만 전송 기능을 직렬화 FJSON을 사용하고

(이이 테스트를 위해이다, 매우 단순한 것입니다) 잘. 다음과 같이 코드 전송이 직렬화에서 내 시도는 다음과 같습니다

// "code" is the users code 
// "obj" is the object above 
// "Extend" is a function defined by the Child process 
var str = FJSON.funkify(obj); 
code = "var temp = FJSON.unfunkify(\"" + str + "\"); Extend(this, temp); temp = undefined; " + code; 

이 일을하고처럼 이상한 (그리고 비밀 오류)를 얻을 아이에 쓰기를 시도 후 : ("예기치 않은 토큰 {"또는 거의 알려지지 않음) "예기치 않은 토큰 ILLEGAL '"(이것은 코드에 아무 것도 없기 때문에 '을 삽입하고 테스트 코드에는 아무 것도 없음을 확인했기 때문에 혼란 스럽습니다).

funkified 문자열은 {"defaultName": "Unnamed","hello":{"FUNCTION":true,"params":["name"],"body":"\n\r if (typeof name === \"undefined\" || name === null)\n\r name = this.defaultName;\n\r echo(\"Hello, \" + name + \"!\");\n\r "}}

그리고 마지막으로, 테스트를 위해, 나는 간단한 객체 직렬화하려고했습니다 (JSON을 사용하여 기능없이, 그리고 FJSON를 사용하여 기능)을에 eval를 실행하려고하면 다음과입니다 문자열은 노드 REPL에 있지만 및 FJSON과 동일하게 시도하면 ...을 계속 수신합니다.

저는 몇 시간 동안이 문제로 어려움을 겪었으므로 다른 것들을 시도하거나 점검 할 생각이 없습니다. 모든 제안을 부탁드립니다.

UPDATE 것은

난 여전히 객체를 stringifying 및 코드와 함께 그것을 전송으로,이 작업을 수행하는 가장 효율적인 방법을 결정할 수 없었습니다

가 작동하지 있었고, 난 그것을 멋지게 I를 작동시킬 수 없습니다 본질적으로 속성을 반복하고 변수를 수동으로 할당하여 객체를 코드로 변환하는 것으로 되돌아갔습니다.

목적 : 예를 제공하기 위해

obj = { 
    prop: "ItsValue", 
    otherProp: true 
}; 

이 될 것입니다 : 업데이트에 나열된

this.prop = "ItsValue"; this.otherProp = true; 

답변

0

내가 해결 방법을 발견, 난 그냥 코드로 객체를 변환. 그 이후로 수정 한 FJSON 라이브러리에 문제가있을 수 있습니다. 이것은 더 이상 문제가 아니지만 원래 문제를 해결할 수있는 답변을 언제나 환영합니다.

관련 문제