2012-03-26 16 views
4
  • vm.runInNewContext는 eval과 같은 검은 색 마술로 간주됩니까?
  • require 사이의 성능이 크게 차이가있는 파일을 읽고 (캐싱 등을 구현 단지 상황에 일부 변수를 추가하고 싶었 경우) 후드 아래에 같은 그것을 실행하는 vm를 사용하거나입니다

답변

3

runInNewContext는 대신 안전하게 다른 스크립트를 실행할 수있는 샌드 박스 환경을 조성하는 방법으로, require 또는 eval의 대체 사용하는 것이 아닙니다.

단점은 속도가 느리고 (생성에는 약 10 밀리 초가 걸림) 몇 메가 바이트가 소요된다는 것입니다. 따라서 아니요, require 대체품으로 사용하지 마십시오.

+0

그래서 컨트롤러 객체 ('/ controllers/blog_controller.js')를로드하고 컨텍스트에 헬퍼를 포함 시키려면 성능 저하가 거의 없을 것입니다. (컨트롤러는 한 번만로드됩니다) –

+0

그냥하지 마십시오. 범용 목적의 경우에는 매우 나쁜 습관으로 간주됩니다. 자신의 컨트롤러 코드를 샌드 박싱해야하는 이유는 무엇이라고 생각하십니까? –

+0

railway-js가 컨트롤러를 사용하는 이유와 마찬가지로 컨트롤러에 더 풍부한 컨텍스트를 제공하는 것과 같은 이유에서'vm'을 사용하는 것보다 더 좋은 솔루션을 발견했습니다. 감사! –

7

implements loading Modules in node.js 코드를 확인한 경우 vm.runInNewContext 또는 vm.runInThisContext을 사용해야합니다. 그러나 require은 모듈 캐싱과 같은 몇 가지 추가 작업을 수행합니다.

node documentation은 동작이 vm 명령과 eval간에 어떻게 유사하고 다른지를 보여줍니다.

그래서 eval과 vm은 모두 조금 다르지만 모두 코드를로드하는 데 사용할 수 있습니다. 클라이언트에서 제공되는 임의의 코드를로드하는 경우 비슷한 보안 문제가 발생합니다.

+0

위의 node.js에 대한 소스 코드 링크가 "고대"이므로, 최근의 7.10.0 소스 코드 링크가 있습니다 : https://github.com/nodejs/node/blob/v7.10.0 /lib/module.js#L543 이들은'vm.runInThisContext' 또는'vm.runInDebugContext'를 사용합니다. 'eval'에 대해서'(0, eval) (....)과 같은 콤마 표현식을 사용하면 전역 범위에서 평가 된 스크립트를 얻을 수 있습니다. 그러면 node.js docu 링크 예제와 같이 로컬 범위를 오염시킬 수 없습니다. 당신은 페이지에서 "eval"을 검색합니다. –