mir.pe (일반/어두운 화면)
최근 수정 시각 : 2023-08-26 05:15:41

eval


프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all" <colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C( 포인터) · C++( 자료형 · 특성 · 클래스 · 이름공간 · 상수 표현식) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript
마크업 문법 HTML · CSS
개념과 용어 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval
기타 == · === · NaN · null · undefined · 모나드 · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 상세3. eval() is evil4. 여담

1. 개요

일부 프로그래밍 언어들에서 지원하는 함수의 일종. 문자열로 된 표현식을 받아 코드로 해석하여 실행하는 역할을 한다. evaluate의 약자로, 문자열이 코드라고 가정하고 평가해서 실행한다는 의미다.

비슷한 함수로 exec 등이 있다.

2. 상세

eval(expression)의 형태로 쓸 수 있다.

일반적으로 코드를 동적으로 실행하기 위해 쓰인다. C언어 같은 컴파일러 언어에서는 지원하지 않고 Perl, JavaScript, Python 같은 스크립트 언어에 존재한다. 사용자가 입력하는 값이나 프로그램이 작동하면서 변하는 값을 문자열의 형태로 반영하여 실행할 수 있기 때문에 간편하다.

실행되는 모습을 보고 싶다면 F12 키를 눌러 자바스크립트 콘솔을 열고,
#!syntax javascript
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()에 들어가면 코드 인젝션으로 판단되어 차단되었다고 뜬 적이 있다.