문제

변수 유형, 변수 이름, 프롬프트 및 기본값 목록을 전달할 수있는 수업을 작성했습니다. 클래스는 WXPYTHON 패널을 만듭니다.이 패널은 프레임에 표시되는 프레임에 표시되어 계산 버튼을 누르기 전에 입력 값을 설정하고 결과를 플롯으로 다시 가져옵니다. Exec 문을 사용하여 모든 변수를 클래스에 추가합니다. 이것은 모든 변수를 한 클래스로 유지하고 이름으로 변수를 참조 할 수 있습니다.

light = Variables( frame , [ ['f','wavelength','Wavelength (nm)',632.8] ,\
                             ['f','n','Index of Refraction',1.0],])

클래스 내에서 나는 다음과 같은 행위로 변수를 생성하고 설정합니다.

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :  
           exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )

변수를 사용해야 할 때는 이름으로 변수를 참조 할 수 있습니다.

 wl = light.wavelength
 n = light.n

그런 다음 Python에서 Exec를 사용할 필요가 거의 없도록 읽었습니다. 이 접근법에 문제가 있습니까? 함께 그룹화 해야하는 변수를 보유하고 편집 할 수 있고, 코드와 WXPython도 표시, 편집, 또한 모든 변수를 파일에 저장하는 클래스를 작성하는 더 좋은 방법이 있습니까? 또는 다시 읽어 읽었습니다)?

무뚝뚝한

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 setattr 객체, 속성의 이름, 값의 세 가지 인수를 취하는 함수. 예를 들어,

setattr(self, 'wavelength', wavelength_val)

다음과 같습니다.

self.wavelength = wavelength_val

그래서 당신은 다음과 같은 일을 할 수 있습니다.

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :
           setattr(self, var_name, var_text_ctrl.GetValue())

다른 팁

나는 Mipadi의 답변에 동의하지만 원래 게시물이 Exec를 사용하는 데 문제가 있는지 물었 기 때문에 하나 더 답변을 추가하고 싶었습니다. 나는 그것을 해결하고 싶다.

범죄자처럼 생각하십시오.

악의적 인 대적을 알고 있다면 다음과 같은 코드가 있다는 것을 알고 있었다.

exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )

그런 다음 코드를 해킹하는 var_name 및 var_text_ctrl에 대한 값을 주입하려고 할 수 있습니다.

악의적 인 사용자가 var_name을이 값으로 만들 수 있다고 상상해보십시오.

var_name = """
a = 1                 #  some bogus assignment to complete "self." statement
import os             #  malicious code starts here
os.rmdir('/bin')      #  do some evil
                      #  end it with another var_name 
                      #  ("a" alone, on the next line)
a     
"""

갑자기, 악의적 인 대적은 당신이 [ute] 코드를 실행하여 /bin 디렉토리 (또는 그들이 원하는 악)를 삭제할 수있었습니다. 이제 귀하의 Exec 진술은 대략적으로 다음과 같은 것을 읽습니다.

exec ("self.a=1 \n import os \n os.rmdir('/bin') \n\n "
             "a" + ' = ' + var_text_ctrl.GetValue() ) 

안좋다!!!

당신이 상상할 수 있듯이, EXEC를 사용할 때 모든 종류의 악성 코드 주입을 구성 할 수 있습니다. 이로 인해 코드를 해킹 할 수있는 방법을 생각하고 위험이없는 대안을 사용할 수있을 때 불필요한 위험이 추가됩니다.

보안 의식의 경우, 수용 가능한 대안이있을 수 있습니다. 예전에는 임의의 Python 코드의 "제한된"실행이 허용되는 모듈 호출 Rexec이있었습니다. 이 모듈은 최근 Python 버전에서 제거되었습니다. http://pypi.python.org/pypi/restrictedpython 임의의 Python 코드를위한 "제한된"환경을 만드는 Zope 사람들의 또 다른 구현입니다.

보안 문제가 있었기 때문에 모듈이 제거되었습니다. Python의 모든 내성과 함께 제한된 환경에서 모든 코드를 실행할 수있는 환경을 제공하기가 매우 어렵습니다.

더 나은 방법은 Eval and Exec를 피하는 것입니다.

벽에서 벗어난 아이디어는 Google App Engine을 사용하고 악의적 인 코드에 대해 걱정하는 것입니다.

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