샌드박스에서 Java용 Rhino를 사용하여 Javascript를 어떻게 실행할 수 있나요?

StackOverflow https://stackoverflow.com/questions/93911

문제

Java 애플리케이션의 일부는 개발자가 아닌 사람이 작성한 Javascript를 실행해야 합니다.개발자가 아닌 사람들은 데이터 형식화에 자바스크립트를 사용하고 있습니다.(주로 간단한 논리와 문자열 연결).

내 질문은 스크립팅 오류가 응용 프로그램의 나머지 부분에 큰 부정적인 영향을 미치지 않도록 이러한 스크립트의 실행을 어떻게 설정할 수 있느냐는 것입니다.

  • 무한 루프로부터 보호해야 함
  • 새로운 스레드 생성을 방지합니다.
  • 서비스 및 환경에 대한 액세스 제한
    • 파일 시스템(예:불만을 품은 스크립트 작성자가 파일을 삭제하기로 결정한 경우)
    • 데이터베이스 (동일하게 데이터베이스 레코드 삭제)

기본적으로 필요한 것만 포함하고 그 이상은 포함하지 않도록 자바스크립트 범위를 설정해야 합니다.

도움이 되었습니까?

해결책

무한 루프를 방지하려면 이를 종료할 수 있도록 별도의 프로세스에 넣어야 합니다.

스레드 생성을 방지하려면 SecurityManager를 확장해야 합니다(기본 구현에서는 신뢰할 수 없는 코드가 루트가 아닌 스레드 그룹에 액세스하는 것을 허용합니다).

Java 보안을 사용하면 파일 시스템에 대한 액세스를 방지할 수 있습니다.

데이터베이스 제한의 경우 표준 SQL 사용자 보안을 사용할 수 있지만 이는 매우 취약합니다.그렇지 않으면 제한사항을 적용하는 API를 제공해야 합니다.

편집하다:JDK6과 함께 제공되는 Rhino 버전에는 보안 작업이 완료되었지만 컴파일러가 포함되어 있지 않다는 점을 지적하고 싶습니다.

다른 팁

무한 루프를 방지하기 위해 스크립트가 실행될 때 명령어 수를 관찰할 수 있습니다(이는 컴파일된 스크립트가 아닌 해석된 스크립트에서만 작동합니다).

이것이 있다 Rhino JavaDocs의 예 스크립트가 10초 이상 실행되는 것을 방지하려면 다음을 수행하세요.

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }

Java 클래스 및 메소드 액세스를 차단하려면 다음을 살펴보십시오.

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

방금 Rhino뿐만 아니라 거의 모든 것을 샌드박싱하는 데 유용할 것 같은 이 블로그 게시물을 발견했습니다.

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

순수한 JavaScript 기능만 찾고 계시다면, 제3자 라이브러리를 가져오지 않고 JDK 내장 Rhino 라이브러리를 기반으로 하는 솔루션이 있습니다:

  1. ScriptEngineManager#getEngineFactories를 통해 JavaScript 스크립트 엔진 팩토리 클래스 이름을 알아보세요.
  2. JavaMembers 또는 기타 관련 클래스가 무시되는 새 클래스 로더에 스크립트 엔진 팩토리 클래스를 로드합니다.
  3. 로드된 스크립트 엔진 팩토리에서 #getScriptEngine을 호출하고 반환된 스크립트 엔진에서 평가 스크립트를 호출합니다.

주어진 스크립트에 Java 스크립트가 포함된 경우 클래스 로더는 JavaMembers 또는 다른 클래스를 로드하려고 시도하고 클래스를 찾을 수 없음 예외를 트리거합니다.이러한 방식으로 악성 스크립트는 실행되지 않고 무시됩니다.

자세한 내용은 ConfigJSParser.java 및 ConfigJSClassLoader.java 파일을 읽어보세요.

https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config

Javascript는 단일 스레드이므로 파일 시스템에 액세스할 수 없으므로 걱정할 필요가 없다고 생각합니다.무한 루프를 방지하기 위해 시간 초과를 설정하는 방법이 있는지 확실하지 않지만 항상 스크립트를 실행하는 (Java) 스레드를 생성한 다음 오랜 시간이 지나면 스레드를 종료할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top