2009-08-28 4 views
16

javax.scripting을 사용하여 서버 측에서 임의로 사용자가 업로드 한 JavaScript를 실행하기위한 지원을 추가합니다. 분명히 그 스크립트를 확보하고 싶습니다!javax.scripting을 사용하여 실행되는 스크립트를 보호하려면 어떻게해야합니까?

Rhino는 자체적으로 런타임에 스크립트를 보안하기위한 프레임 워크를 가지고 있습니다. 그러나 javax.scripting에 대한 설명서에는 보안, 사용 권한 또는 스크립트에서 사용할 수있는 클래스 제한에 대한 언급이 없습니다. 이것은 javax.scripting API의 막대한 구멍입니다. 실행되는 스크립트를 보호하기위한 프레임 워크를 제공하지 않습니다.

원래 Rhino를 사용했지만 Java 인스턴스를 실행중인 스크립트에 노출시키는 데 문제가 있었기 때문에 Rhino를 직접 사용하고 싶지 않습니다. javax.scripting 프레임 워크 (Rhino를 사용)는이 작업을 단순하게 만들었고 멀티 스레드 서버에서 스크립트를 실행하는 것을 단순화했습니다.

실행중인 스크립트에서 액세스/인스턴스화 할 수있는 Java 클래스를 화이트리스트하고 싶습니다. 누구든지 이것을 달성하는 방법에 대한 예제 나 문서를 가르쳐 줄 수 있습니까?

답변

18

javax.scripting은 보안 프레임 워크를 제공하지 않습니다. 일부 검색 후에 자바의 doPrivilegedAction 프레임 워크를 사용하려고 시도했지만 Google의 캐시에있는 문서를 발견했지만 실험을 마친 후에 스크립트가 소켓을 열거 나 파일 시스템에 액세스하지 못하도록 할 수 없었습니다.

내가이 질문을 한 후에 StackOverflow에서 이전에 여기에 질문했습니다. How can you run Javascript using Rhino for Java in a sandbox? 해당 페이지에서 JDK6에 포함 된 Rhino에 보안이 이미 적용되었음을 잘못 나타냅니다. 앞에서 설명한대로 스크립트에서 소켓 및 기타 유해한 동작을 열 수있었습니다.

결국 나는 javax.scripting을 포기하고 Rhino를 직접 포함 시켰습니다. 또한 내가 쉽게이 개 결과를 달성 할 수 있던 ClassShutter있는 사용자 정의 ContextFactory을 구축함으로써 :

  1. 이 최대 제한 시간에 스크립트 실행 시간을 제한
  2. 내가 흰색 상장이다 가지고있는 사람들에게 클래스에 대한 액세스를 제한 기본적으로 java.lang.*과 내 서버의 계층 구조에서 일부 클래스를 선택하십시오.

CodeUtopia (새 사용자는 단일 게시물의 여러 페이지에 연결할 수 없지만 다른 StackOverflow 게시물에 링크되어 있기 때문에 연결할 수 없습니다)는 설명하는 데 유용했습니다. ClassShutter 아키텍처 및 Rhino 고유의 ContextFactory API 페이지에서는 맞춤 ContextFactory 빌드 방법을 설명합니다.

2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/은 sandbox rhino에 대한 방법을 설명하고 javax.scripting은 Rhino를 JS 스크립트 엔진으로 사용하므로 패키지 이름은 다를 수 있지만 위의 코드를 사용할 수 있어야합니다.

저는 에 스크립팅이 필요한 Java 응용 프로그램을 개발 중입니다. 앱 은 신뢰할 수없는 JavaScript 코드를 타사에서 실행해야하므로 은 내가 원하는 코드를 제외한 모든 Java 메소드에 대한 액세스를 차단해야합니다. 은 스크립트에 대한 자바 액세스를 제공하는 Rhino의 기능인 을 사용할 수있는 쉬운 방법 이었지만 아무런 문제가 없었습니다. 그러나 은 없습니다.

그러나 많은 파기 후에 주위에 , 나는 마침내 할 길을 발견했다 너무 많은 해킹없이. 사실, 몇 가지 Rhino 클래스를 확장하고 제공된기본 설정 중 일부를 무시하도록 제공된 설정 도구를 사용하면됩니다.

0

참고로 Nashorn이라는 새로운 엔진을 사용하는 javax.scripting의 새로운 Java 8 구현에서이 기능을 사용할 수 있습니다. Secure Nashorn JS Execution

을 참조하십시오.