샌드박스에서 Java용 Rhino를 사용하여 Javascript를 어떻게 실행할 수 있나요?
-
01-07-2019 - |
문제
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 라이브러리를 기반으로 하는 솔루션이 있습니다:
- ScriptEngineManager#getEngineFactories를 통해 JavaScript 스크립트 엔진 팩토리 클래스 이름을 알아보세요.
- JavaMembers 또는 기타 관련 클래스가 무시되는 새 클래스 로더에 스크립트 엔진 팩토리 클래스를 로드합니다.
- 로드된 스크립트 엔진 팩토리에서 #getScriptEngine을 호출하고 반환된 스크립트 엔진에서 평가 스크립트를 호출합니다.
주어진 스크립트에 Java 스크립트가 포함된 경우 클래스 로더는 JavaMembers 또는 다른 클래스를 로드하려고 시도하고 클래스를 찾을 수 없음 예외를 트리거합니다.이러한 방식으로 악성 스크립트는 실행되지 않고 무시됩니다.
자세한 내용은 ConfigJSParser.java 및 ConfigJSClassLoader.java 파일을 읽어보세요.
https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config
Javascript는 단일 스레드이므로 파일 시스템에 액세스할 수 없으므로 걱정할 필요가 없다고 생각합니다.무한 루프를 방지하기 위해 시간 초과를 설정하는 방법이 있는지 확실하지 않지만 항상 스크립트를 실행하는 (Java) 스레드를 생성한 다음 오랜 시간이 지나면 스레드를 종료할 수 있습니다.