2010-08-18 3 views
30

파이썬에서 "계산기 API"를 쉽게 할 수있는 방법을 원합니다.Python : eval safe

지금 당장 계산기가 지원할 정확한 기능에 대해서는별로 신경 쓰지 않습니다.

"1+1" 문자열을 받고 결과가있는 문자열을 반환하려면이 경우 "2".

eval 그런 일에 안전한 방법이 있습니까?

처음에는 내가 (을 참조하거나) 그래서 발신자 내 지역 변수와 혼란하지 수

env = {} 
env["locals"] = None 
env["globals"] = None 
env["__name__"] = None 
env["__file__"] = None 
env["__builtins__"] = None 

eval(users_str, env) 

할 것입니다.

하지만 여기에서 많은 것을 감독 할 것이라고 확신합니다.

eval 님의 보안 문제를 고칠 수 있습니까? 아니면 제대로 작동하려면 너무 많은 세부 정보가 있습니까?

+0

참조 : http://stackoverflow.com/questions/594266/equest-parsing-in-python – kennytm

+0

문제가 해결 될 수 있습니까? https://github.com/odoo/odoo/blob/d7cfa8c502f27bee5c2fccb35db47b08e3b3804b/odoo/ tools/safe_eval.py – bkmagnetron

답변

43

가의 평가 보안 문제는 고칠 수 있습니다 또는 는 가 잘 작동하게하기 위해 너무 많은 작은 세부 사항이 있습니까?

확실히 후자 - 영리한 해커는 항상주의 사항 주위에 방법을 찾아 낼 수 있습니다.

기본 리터럴을 사용하는 일반 표현식에만 만족하면 ast.literal_eval을 사용하십시오. 더 좋아하는 것이 있다면, 고전적인 lexx/yacc 접근법에 익숙하고 익숙하다면 ply과 같은 구문 분석 패키지를 사용하거나 Pythonic 접근법을 사용하는 경우 pyparsing을 사용하는 것이 좋습니다.

+0

'ast.literal_eval'을 크래쉬 할 수 있습니다 : / –

2

보안 문제는 고칠 수는 없지만 해결할 수는 있습니다.

표현식을 토큰 목록으로 구문 분석하는 데는 문법이 간단하므로 토큰을 개별적으로 처리해야합니다.

유효한 파이썬 구문을 사용하고 있으므로 ast 모듈을 사용하여 Python AST를 빌드 할 수도 있지만 이는 미묘한 보안 구멍에 노출 될 수 있습니다.

+0

지역 변수와 전역 변수를 None으로 설정했기 때문에 이것이 작동하지 않는다고 생각합니다. 그래서 eval 표현식 내부에서 보이지 않습니다. – flybywire

+0

@flybywire : 사과, 그건 사실입니다; 편집 됨. 그래도 여전히 나쁜 생각. – katrielalex

+0

@flybywire : http://stackoverflow.com/questions/661084/security-of-pythons-eval-on-untrusted-strings – katrielalex

7

과정에 정의 된 모든 클래스에 액세스하여 인스턴스를 만들고 메서드를 호출 할 수 있습니다. CPython 인터프리터를 segfault하거나 종료 할 수 있습니다. 이 참조 : Eval really is dangerous

1

펄은 안전 평가 모듈 http://perldoc.perl.org/Safe.html

에게 인터넷 검색을 "펄 안전의 파이썬 해당"가 http://docs.python.org/2/library/rexec.html

를 찾지 만이 파이썬 "제한 간부는"사용되지 않습니다.

-

전체 "평가"보안, 어떤 언어로, 큰 문제입니다. SQL 삽입 공격은 그러한 보안 허점의 한 예일뿐입니다.Perl Safe는 지난 수년 동안 보안 버그를 가지고있었습니다. 가장 최근에 내가 기억하고있는 것은 안전한 평가에서 반환 된 객체의 소멸자를 제외하고는 안전합니다.

내 도구에는 사용할 수 있지만 웹에는 노출되지 않을 수도 있습니다.

그러나 언젠가는 많은/모든 언어에서 완벽한 보안 증거가 제공되기를 바랍니다.