2012-06-20 2 views
3

질문은 this one과 매우 비슷하지만 다른 문제에 집중해야합니다.Java에서 샌드 박스 플러그인 확장 응용 프로그램 만들기

대형 데이터베이스 (예 : 영화 데이터베이스)가있는 애플리케이션이 있다고 가정 해 보겠습니다. 응용 프로그램 사용자는 자신의 플러그인을 추가하고 플러그인을 실행할 수 있어야합니다.

시나리오는 다음과 같이 수 :

  • 출시 주요 응용 프로그램은
  • 의 주요 응용 프로그램을 말해/응용 프로그램/플러그인 디렉토리에
  • 장소 통계-plugin.jar 새로운 플러그인을로드 할 수
  • 는 (예 : 하나를 설치 한)과
  • 을 실행 통계-plugin.jar가 조회하는 플러그인을 선택 플러그인을
  • 을 나열하는 응용 프로그램을 말해 영화에 대한 DB와 공포 영화를 계산 메인 앱이 결과


각 플러그인을 호출 할 것이다 표준 방법 (공통 Plugin 인터페이스), 예를 들어, 몇 가질 수를 제공

  • 개수를 반환 onInitialize, onRun

    메인 앱이 보장해야하는 것은 플러그인이 충돌 (예 : 0으로 나누기)하면 메인 앱이 안정적으로 유지됩니다 (예 : 오류 대화 상자가 표시되지만 충돌하지 않음) . 또한 실행 시간을 제한하고 플러그인이 수행중인 작업을 확인할 수도 있습니다.

    이것은 모두 샌드 박스 플러그인 환경을 요약 한 것입니다. 가장 중요한 사항은 플러그인 스타일의 확장 성 및 플러그인 샌드 박스이므로 안전한 작업 (예 : DB 읽기는 업데이트하지만 업데이트하지 않음) 만 허용됩니다.

    플러그인을 Java로 작성하지 않아도됩니다. 어떤 식 으로든 실행 파일이 필요합니다 ... 가능한 경우 JavaScript 파일 일 수도 있습니다.

    어떻게 이러한 작업에 접근하겠습니까?

  • 답변

    1

    Security Manager을 사용하고 사용자 자신의 권한 중 일부를 정의해야합니다. 이미 정책을 정의 할 때 사용할 수있는 일반적으로 사용되는 권한 집합이 있습니다.

    RDBMS에 대한 읽기 전용 액세스는 Java 환경의 범위 내에 있지 않을 수 있습니다. 대신 일반적으로 특정 권한이있는 별도의 RDBMS 사용자를 사용하여 처리됩니다. 프레임 워크는 해당 사용자 이름을 사용하여 DB에 연결해야합니다.

    +0

    RW 작업은 그 예입니다. 앱에 공개 메소드'read'와'write'가 있다고 가정하고 플러그인이 호출되면 기본 앱 (예 : 요청 레코드)과 통신 할 수 있습니다. 반면에, 번들이 아닌 (원래가 아닌) 플러그인은'write'를 호출 할 수 없습니다. 이것을 달성하는 방법? 반사? – emesx

    +1

    프레임 워크는 사용자 정의 권한을 처리하기 위해 필요하다면 (예 : 아마도'read' /'write' 메소드 내에서)'checkPermission'을 호출해야합니다. 정책은 위치 (코드베이스)에 따라 특정 클래스로 제한 될 수 있습니다. 플러그인을로드 할 때 클래스 로더가 올바르게 설정해야합니다. 이것은 전체적으로 꽤 복잡한 시스템 일 것 같다. [이 질문] (http://stackoverflow.com/q/502218/372643) 관심이 있어야합니다. – Bruno

    +0

    글쎄, 당신의 adivice 아마 좋은 것입니다,하지만 짧은 연구 후 전혀 Java 플러그인을 허용하지 않을;) – emesx

    -2

    자바가 신뢰할 수없는 플러그인을 실행하기에 적합한 플랫폼이라고 생각하지 않습니다. 플러그인이 실행되면 호스트 프로그램이 수행 할 수있는 모든 작업을 수행 할 수 있습니다.

    이 주 프로그램의 일부로 실행되는 "안전한"작업의 추상화 레이어와 샌드 박스를 만들어야합니다. 플러그인은 을 프로그램으로 해석하는 데이터를 제공 할 수 있습니다. 플러그인 실행을 허용 할 수 없습니다.

    +0

    확실한 것. 내 업데이트 된 게시물을 확인하십시오. – emesx

    1

    자신의 보안 정책 파일과 보안 관리자를 사용하여 이와 같은 작업을 수행 할 수 있습니다.기본적으로, 자신의 jar AllPermission과 플러그인 jar에 대한 사용 권한을 줄입니다. 그렇게하면 신뢰할 수없는 애플릿에서 사용할 수있는 작업을 제한 할 수 없으므로 무한 루프를 생성하거나 100GB RAM을 할당하는 스레드를 작성할 수 있습니다.

    DB 액세스를 허용하지만 특정 작업 만 허용하려면 신뢰할 수있는 작업 (예 : SELECT 문 유효성 검사)을 제공하고 AccessController.doPrivileged를 호출하는 API (사용자의 신뢰할 수있는 Jar 중 하나에 있음)를 제공해야합니다. 이후에 조작을 실행하는 것이 신뢰할 수있는 경우. 신뢰할 수없는 코드가 소켓 연결을 열지는 못하기 때문에 (특정 호스트에 허용되지 않는 한) 코드는 DB를 그렇게 혼란스럽게 할 수 없습니다.

    그러나 보안 관리자를 올바르게 구현하는 것은 까다로울 수 있습니다. (최근에는 Batik Squiggle과 같은 구현에서 버그가 발견됨) 에뮬레이트 된 언어 (예 : JavaScript/Rhino)를 사용하는 것이 더 안전 할 수 있습니다.

    0

    Java Authentication and Authorization Service을 사용하여 이러한 플러그 가능 아키텍처를 구현할 수 있습니다. JAAS를 사용하면 제한된 액세스 제어 권한으로 플러그인을 실행할 수 있습니다. ACL은 소켓 연결 열기, 파일 쓰기, 데이터베이스 연결 열기 등을 제한 할 수 있습니다.

    데이터베이스 액세스의 경우 JNDI 데이터 소스를 통해 데이터베이스 연결을 제공하고 데이터베이스를 업데이트하지 마십시오.

    관련 문제