2012-03-05 3 views
6

내 앱이 JSON 파일에서 읽는 신뢰할 수없는 사용자의 표현식을 평가하도록합니다. 예 :샌드 박스에서 사용자 표현식을 평가하는 방법

value = "(getTime() == 60) AND isFoo('bar')" 

여기 StackOverflow에서 많은 스레드를 발견했습니다. 일반적으로 자바 스크립트를 읽을 수있는 자바 자신의 ScriptEngine 클래스를 사용하여 추천합니다. 또는 JEXL, MVEL 또는이 목록의 다른 라이브러리와 같은 기존 라이브러리를 사용하도록 사용자에게 권장 : http://java-source.net/open-source/expression-languages

하지만 모두 신뢰할 수있는 사용자 (예 : 사용자가 직접 작성한 구성 파일 및 스크립트를 작성하고 싶습니다.) 하지만 제 경우에는 표현식 평가가 안전한 샌드 박스에서 실행되기를 바랍니다. 따라서 사용자는 같은 간단한 수행 할 수 없습니다

value = "while(true)" // or 
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL 

을 그리고 내 응용 프로그램, 또는 액세스 원치 않는 리소스를 잠급니다.

1) 따라서 기존 라이브러리를 쉽게 구성하여 안전한 상자에서 실행할 수 있습니까? '쉽게', 내 자신의 표현식 평가기를 쓰는 것보다 빠르게 사용할 수있는 상위 수준 구성 API를 의미합니다. 저의 연구를 조금 해본 후에, JEXL과 MVEL은 모두 외면한 것처럼 보입니다.

2) 매우 간단하여 신뢰할 수없는 사용자가 악용 할 수없는 기존 표현식 언어가 있습니까? 내가 찾은 모든 것들은 매우 복잡하며 루프, import 문 등을 구현합니다. 수학, 논리 연산자 및 정의 된 변수와 메서드를 구문 분석하면됩니다. 그 이상은 내 범위 밖에 있습니다.

3) 유일한 해결책은 내 표현식 평가기를 작성하는 것이고 일관된 보안 모델을 작성하는 방법에 대한 지침은 어디에서 찾을 수 있습니까? 필자는 이것에 익숙하지 않으며 코드 삽입에 사용되는 일반적인 트릭이 무엇인지 알지 못합니다. 그래서 나는 이것을 독자적으로 쓰지 않아도되고 싶었습니다.

+1

(신뢰할 수없는 Java 코드의 약간 어렵게 상황을 다루는) 다음과 같은 질문에서 유용한 정보가있을 수 있습니다 : http://stackoverflow.com/questions/9041446/what-of-the-the-the-the-the-the-the-the-the-the-the-the-the-the-the-the-run-user-supplied-ja/9041423 # 9041423 – DNA

+0

이 질문에 대한 답변을 얻었습니까? – ccleve

+0

나를 만족시킬만한 것은 없습니다. 나는 그것을 내 자신으로 만들고 그것을 배우기로 결심했다. – VIBrunazo

답변

1

Rhino를 삽입하여 사용자가 자바 스크립트를 작성할 수 있도록하는 것이 좋습니다. 그것은 (2) 자바 스크립트를 실행하거나 (자바 스크립트에서 자바를 실행할 수있게 해주는) 자바 라이브러리가되는 기준에 맞습니다.

컨텍스트를 설정하면 컨텍스트에 넣거나 컨텍스트에 넣을 수있는 액세스 권한 만 있습니다. 자바 스크립트 표현식은 위에서 보여준 가장 단순한 경우처럼 단순 할 수도 있고, 필요에 따라 복잡해질 수도 있습니다. Rhino를 임베딩하고 제한된 개체 세트를 노출하는 것은 과거 프로젝트에서 모든 종류의 사용자 스크립팅을 가능하게하는 좋은 방법이었습니다. 몇 년 전 이었지만 현재 Rhino는 매우 성숙했습니다.

또한 문제가 필요하다면 똑같은 식으로 클라이언트 또는 서버 측을 행복하게 실행할 수 있도록 설정할 수 있다는 장점이 있습니다.

당신이 http://www.mozilla.org/rhino/tutorial.html#runScript에 필요한 달성하기 위해 코뿔소를 내장에

대한 자세한 내용