eval
1. 개요
일부 프로그래밍 언어들에서 지원하는 함수의 일종. 문자열로 된 표현식을 받아 코드로 해석하여 실행하는 역할을 한다. evaluate의 약자로, 문자열이 코드라고 가정하고 평가해서 실행한다는 의미다.
비슷한 함수로 exec 등이 있다.
2. 상세
eval(expression)의 형태로 쓸 수 있다.
일반적으로 코드를 동적으로 실행하기 위해 쓰인다. C(프로그래밍 언어) 같은 컴파일러 언어에서는 지원하지 않고 Perl, JavaScript, Python 같은 스크립트 언어에 존재한다. 사용자가 입력하는 값이나 프로그램이 작동하면서 변하는 값을 문자열의 형태로 반영하여 실행할 수 있기 때문에 간편하다.
실행되는 모습을 보고 싶다면 F12 키를 눌러 자바스크립트 콘솔을 열고,
e = 1
eval('2 + e')
라고 타이핑해보자. 당신이 두번째 줄의 인자로 입력한 것은 분명히 문자열이지만 정수 2와 변수 e 즉 정수 1을 더하여 3이 출력될 것이다.3. eval() is evil
그러나 eval의 사용은 많은 경우에 금기시된다. '''치명적인 보안 위험'''이 있기 때문이다. GOTO문의 경우보다도 위험한데, GOTO는 아무리 잘못 써 봤자 그 코드를 다시 편집할 수 없게 만드는 정도에서 그치는 반면 eval문을 잘못 사용하는 경우, 예를 들면 '''네트워크 상에서 가져온 문자열을 실행'''하는 경우 악의적으로 표현식을 작성한 사람에 의해 '''모든 너 데이터 다 내거다요 등의 사태'''가 일어날 수 있기 때문이다.
eval만으로 동적 실행을 하지 않으려고 하면 보안 위험이 적은 대체품은 얼마든지 있다. 일반적인 경우에는 동적으로 변수 등을 정해주는 함수, Python이라면 setattr를 사용하면 될 일이지 eval까지 사용할 이유는 없다.
4. 여담
나무위키는 Cloudflare를 사용하기 때문에 https://namu.wiki/w/eval()에 들어가면 코드 인젝션으로 판단되어 차단되었다고 뜬 적이 있다.