항상 신뢰할 수없는 코드는 별도의 프로세스에서 실행해야합니다. 이는 샌드 박스 모듈이 수행하는 것과 정확히 같습니다. 간단한 이유는 노드를 고정시킵니다.
별도의 프로세스를 시작하여 나중에 표준 출력에서 JSON에 직렬화 된 결과를 전송합니다. 부모 프로세스는 자식이 수행하는 작업에 관계없이 실행을 계속하고 제한 시간을 트리거 할 수 있습니다.
그런 다음 신뢰할 수없는 코드는 strict mode이라는 클로저로 래핑됩니다 (일반 JavaScript에서는 arguments.callee.caller
을 사용하여 범위 외부의 데이터에 액세스 할 수 있음). 마지막으로 매우 제한된 global
개체가 전달되어 노드의 API에 대한 액세스를 차단합니다. 신뢰할 수없는 코드는 기본 계산 만 수행 할 수 있으며 파일이나 소켓에 액세스 할 수 없습니다. 당신은 영감 샌드 박스의 코드를 읽어야하는 동안
, 나는 그대로 사용을 권장하지 것이다 :
- 코드는 기존지고 7 개월 동안 업데이트되지 않았습니다.
- 노드의 하위 프로세스 모듈은 필요한 대부분의 기능, 특히 child_process.fork()을 제공합니다.
- child_process.fork에서 제공하는 IPC 채널의 성능이 아마도 좋을 것입니다.
보안을 강화하려면 setuid-sandbox을 고려해 볼 수도 있습니다. 탭 프로세스가 파일 시스템에 액세스하지 못하도록 Google 크롬에서 사용하는 코드입니다. 네이티브 모듈을 만들어야하지만이 example은 간단합니다.
노드 코어의 일부이기 때문에'vm '을 사용하는 것이 좋습니다. 그리고 노드 코어가 버그를 고치는 경향이 있기 때문에 문제가 해결 될 것이라고 가정합니다. – Raynos
@Raynos 버그가 아닙니다. 워드 프로세서는 단지 알려진 코드만을위한 것이라고 말합니다. – thejh
@thejh - true이지만, API는 코드가 완전히 다른 컨텍스트에서 실행되고 있다는 사실에 대해 매우 합리적인 믿음을 갖기 때문에이 코드가 현재 컨텍스트에 액세스 할 수 없어야 함을 의미합니다. API의 * 의도 *가 정확히 스크립트를 실행하는 샌드 박스를 제공하기를 기대합니다. ... 이건 아주 잘 문서화 된 버그라고 생각합니다. :) – broofa