2014-10-05 5 views
0

GUI에 대한 명령 줄을 선호하는 사람들에게 친숙한 시뮬레이터 인터페이스를 만들고 있습니다. 시뮬레이터에 레벨을 제공하기 위해 사용자는 정보를 파일에 입력 한 다음 파싱하고 디자인 포인트를 생성 한 다음 주 서버로 전송합니다.사용자가 제공 한 목록 이해력을 어떻게 위생 처리합니까?

사용자가 모든 개별 레벨을 입력 할 필요가 없도록 일종의 "범위"기능을 구현할 수 있기를 바랍니다. 단순한 가산 시퀀스보다 많은 전력이 필요합니다. 파서와 관련 코드가 이미 파이썬에 있기 때문에, 이것은리스트 보급을위한 완벽한 유스 케이스처럼 보입니다. 그러나 목록 이해는 사용자 입력이며 유효하지 않을 수 있습니다. eval을 사용하면 너무 위험한 것처럼 보입니다. literal_eval은 목록의 내포를 지원하지 않습니다.

나의 현재 목표는 유효하고 안전을 위해이 같은입니다 :

{"Factor 1": [1,2,3,7,8], 
"Factor 2": "[2**x for x in range(5,20) if (x % 3) == 0]"} 

JSON 사용자 유형이다 파일의 기본 형식입니다. 나는 다양한 사용자 요구를 채우기 위해 추가 기능 (예 : range)을 갖기 위해 언어를 확장하려고합니다. "데이터 세트 1"은 기존 시스템에서 분석 할 수 있습니다. 목록 이해력은 사용자 컴퓨터에서 평가되므로 'x'*9**999999**99999과 같은 단순한 공격은 자체 파괴적입니다.

range 함수를 정규식을 사용하여 비교적 쉽게 위생적으로 보이지만 다른 부분이 안전한지 확인하는 방법을 모르겠습니다. regexes는이 작업에 충분합니까? 아니면 내가 따라야하는 또 다른 접근법이 있습니까?

+0

당신의 질문은 약간 혼란 스럽습니다. 로컬 컴퓨터에서 파이썬 코드를 평가하고 결과를 서버로 보내고 있습니까? 또는 코드를 서버로 전송하고 서버가 무거운 작업을하도록 할 수 있습니까? –

+0

파이썬 코드와 비슷하지만 사용자가 파이썬 코드를 입력합니까? 그렇다면 파이썬 파서가 파싱해야합니다. 일반적으로 사용자가 코드를 입력하도록 허용하지 않습니다. – sln

+0

깨끗한 것은 아니지만 사용자가 간단한 목록 보완 기능을 사용할 것으로 예상되는 경우 실행이 너무 많이 걸리면 중지 할 수 있습니다. [link] (http://stackoverflow.com/questions/492519/timeout-on- a-python-function-call) – Hrabal

답변

0

추가 분석 결과 eval은 평소보다 덜 위험하다는 것을 보여줍니다. 구문 분석은 모두 클라이언트 쪽에서 수행되며 프로젝트 코드는 오픈 소스입니다. 따라서 사용자가 eval을 악용하여 악의적으로 수행 할 수있는 행위는 자기 파괴 적이거나 덜 복잡한 방식을 통해 가능합니다. 따라서 eval을 사용하여 수준 목록을 생성 할 수 있습니다.

물론 나는 대부분의 사람들 (자신을 포함하여)이 사용하기 위해 가지고있는 "평가는 악이며, 불을 지우는"반응 때문에이 결정을 강력하게 문서화해야 할 것입니다.