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
을 사용하는 모든 데이터를 회피하거나 잠재적으로 유해한 기능에 대한 접근이 없는 상태에서 실행하여야 한다.
$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)
이 글은 프로그래밍 언어에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |