Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
본문으로 이동

eval

위키백과, 우리 모두의 백과사전.
2001:e60:87d5:f421:18da:4221:94c5:2d8e (토론)님의 2024년 4월 26일 (금) 16:48 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

eval 함수는 일부 프로그래밍 언어에서 제공하는 함수의 일종이다. 문자열을 입력 받아 그 문자열을 expression으로 처리한 후 결과값을 반환하는 함수이다. eval에 대한 입력은 반드시 문자열일 필요는 없다. 추상 구문 트리(리스프 형식과 같은) 또는 코드(파이썬과 같은)와 같은 특수 유형의 구조화된 코드 표현일 수 있다. 명령문과 유사한 것은 exec로, 마치 명령문인 것처럼 문자열(또는 다른 형식의 코드)을 실행한다. 파이썬과 같은 일부 언어에서는 둘 다 존재하지만 다른 언어에서는 eval 또는 exec 중 하나만 존재한다.

eval 및 apply는 언어 자체 내에서 호출할 수 있는 언어 해석기인 메타 순환 평가기(meta-circular evaluators)의 인스턴스이다.

보안 위험

[편집]

신뢰할 수 없는 장소로부터 온 데이터에 eval을 사용할 때는 특별히 주의해야 한다. 이를테면, get_data() 함수는 인터넷으로부터 데이터를 가져온다고 할 때, 이 파이썬 코드는 안전하지 않다:

session['authenticated'] = False
data = get_data()
foo = eval(data)

공격자가 프로그램에 "session.update(authenticated=True)" 문자열을 데이터로 공급하면 session 디렉터리를 업데이트하여 인증 키를 True로 설정한다. 이를 해결하려면 eval을 사용하는 모든 데이터를 회피하거나 잠재적으로 유해한 기능에 대한 접근이 없는 상태에서 실행하여야 한다.

프로그래밍에서의 이용

[편집]

PHP

[편집]
$name = 'John Doe';
$greeting = 'Hello';
$template = '"$greeting,  $name! How can I help you today?"';
print eval("return $template;");

자바스크립트

[편집]

이때의 결과는 12+34의 결과인 46으로 alert창이 뜨게 된다.

foo = 12+34;
alert(eval(foo));

[편집]
$foo = 2;
print eval('$foo + 2'), "\n";

루비

[편집]
a = 1
eval('a + 1') #  (evaluates to 2)

# evaluating within a context
def get_binding(a)
  binding
end
eval('a+1',get_binding(3)) # (evaluates to 4, because 'a' in the context of get_binding is 3)

외부 링크

[편집]