문제

나는 스프레드 시트와 같은 계산 (numpy / scipy 사용)을 구현하기 위해 "안전한"평가 함수를 찾고 있습니다.

이 작업을 수행하는 기능 ( rexec 모듈 )이 제거되었습니다.수정 불가능한 보안 문제로 인해 2.3 이후 Python에서.이 작업을 수행한다고 주장하는 여러 타사 해킹이 있습니다. 내가 찾은 가장 신중한 솔루션은 이 Python Cookbok 레시피 , "safe_eval".

악성 코드로부터 보호하기 위해 이것을 사용하거나 비슷한 것을 사용하는 것이 합리적으로 안전합니까, 아니면 나만의 파서를 작성해야합니까?더 나은 대안을 아는 사람이 있습니까?

편집 : 방금 Zope의 일부인 RestrictedPython 을 발견했습니다.이에 대한 모든 의견을 환영합니다.

도움이 되었습니까?

해결책

안전에 대한 정의에 따라 다릅니다.많은 보안은 전달하는 내용과 컨텍스트에서 전달할 수있는 내용에 따라 다릅니다.예를 들어 파일이 전달되면 임의의 파일을 열 수 있습니다. 라코 디스

더욱이 환경은 매우 제한되어 있습니다 (모듈을 전달할 수 없음). 따라서 re 또는 random과 같은 유틸리티 함수 모듈을 단순히 전달할 수 없습니다.

다른 한편으로, 당신은 당신 자신의 파서를 작성할 필요가 없습니다. 당신은 파이썬 ast에 대한 당신의 평가자를 작성할 수 있습니다 : 라코 디스

그러면 안전한 수입을 구현할 수 있기를 바랍니다.다른 아이디어는 Jython 또는 IronPython을 사용하고 Java / .Net 샌드 박싱 기능을 활용하는 것입니다.

다른 팁

나만의 파서를 작성하는 것이 재미있을 수 있습니다!사람들이 수식을 입력 할 때 Python이 아닌 익숙한 스프레드 시트 구문 (Excel 등)을 사용하기를 기대하기 때문에 더 나은 옵션 일 수 있습니다.나는 safe_eval에 익숙하지 않지만 이와 같은 것은 확실히 악용 가능성이 있다고 생각합니다.

그 코드는 매우 안전 해 보이지만 충분한 동기를 가진 사람이라면 충분한 시간이 주어지면 코드를 깨뜨릴 수 있다는 의견을 항상 갖고 있습니다.그것을 극복하기 위해서는 상당한 결의가 필요할 것이라고 생각하지만 상대적으로 그렇게 할 수 있다고 확신합니다.

단순히 Python에서 데이터 구조를 작성하고 읽을 필요가 있고 사용자 지정 코드를 실행하는 실제 용량이 필요하지 않은 경우 다음 방법이 더 적합합니다. http://code.activestate.com/recipes/364469-safe-eval/

코드가 실행되지 않고 문자열, 목록, 튜플, 사전 등 정적 데이터 구조 만 평가됩니다.

다니엘, Jinja 는 유용하거나 유용하지 않을 수있는 샌드 박스 환경을 구현합니다.내가 기억하는 바에 따르면 아직은 이해 목록을 "이해"하지 못합니다.

Sanbox 정보

원하는 기능은 컴파일러 언어 서비스에 있습니다. http://docs.python.org/library/language.html 표현식 만 허용하도록 앱을 정의하는 경우 입력을 표현식으로 컴파일하고 그렇지 않은 경우 예외를 가져올 수 있습니다.세미콜론 또는 명세서 양식이있는 경우

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