귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 언어별 사용법 == 각 언어에서 '''eval()''' 또는 유사 기능이 제공되는 방식은 조금씩 다르다. 여기서는 대표적으로 자바스크립트, 파이썬, PHP, Ruby에서의 사용 예시를 살펴보고 주의해야 할 점을 정리한다. === 자바스크립트 === [[자바스크립트]]에서는 '''eval()''' 함수를 통해 문자열로 된 자바스크립트 코드를 실행할 수 있다. 스크립트 엔진이 문자열을 자바스크립트 코드로 해석하여 실행하기 때문에, 사용자의 입력을 함부로 전달하면 보안 취약점이 될 수 있다. '''기본 사용''' <syntaxhighlight lang="javascript"> // 간단한 수식 계산 eval('2 + 2'); // 결과: 4 // 변수 선언과 사용 let x = 10; eval('x + 5'); // 결과: 15 // 여러 줄의 코드 실행 eval(` let a = 5; let b = 3; a * b; `); // 결과: 15 </syntaxhighlight> '''응용 예제''' <syntaxhighlight lang="javascript"> // 동적으로 함수 생성 let functionString = ` function add(a, b) { return a + b; } `; eval(functionString); add(5, 3); // 결과: 8 // JSON 파싱 (비추천 - JSON.parse() 사용 권장) eval('(' + '{"name": "John", "age": 30}' + ')'); </syntaxhighlight> 자바스크립트에서는 '''eval()'''을 대체하기 위해 '''Function()''' 생성자를 사용하는 방법이 있으나, 이 역시 보안상 유사한 위험을 내포한다. JSON 데이터를 해석해야 하는 경우 '''JSON.parse()''', 템플릿 문자열을 다루어야 할 때는 안전한 템플릿 엔진을 사용하는 것이 바람직하다. === 파이썬 === [[파이썬]]에서는 '''eval()'''과 '''exec()''' 두 가지 함수를 제공한다. '''eval()'''은 단일 표현식을 평가하고 결과를 반환하며, '''exec()'''는 여러 줄에 걸친 파이썬 코드를 실행할 수 있다. 두 함수 모두 외부 입력을 처리할 때 보안 문제가 발생할 수 있으므로 주의가 필요하다. '''eval() 사용''' <syntaxhighlight lang="python"> # 수식 계산 eval('2 ** 3') # 결과: 8 # 리스트 조작 x = [1, 2, 3] eval('x[0] + len(x)') # 결과: 4 # 딕셔너리 생성 eval("{'name': 'Python', 'year': 1991}") </syntaxhighlight> '''exec() 사용''' <syntaxhighlight lang="python"> # 여러 줄의 코드 실행 program = """ def greet(name): return f'Hello, {name}!' result = greet('Python') """ namespace = {} exec(program, namespace) print(namespace['result']) # 출력: Hello, Python! # 클래스 동적 생성 class_def = """ class DynamicClass: def __init__(self, value): self.value = value def get_value(self): return self.value * 2 """ exec(class_def) obj = DynamicClass(5) obj.get_value() # 결과: 10 </syntaxhighlight> 파이썬에서는 '''eval()'''이 단일 표현식만을 다룰 수 있고, '''exec()'''는 반환값 없이 전체 코드 블록을 실행한다. 따라서 코드 구조가 복잡해질수록 '''exec()''' 활용 시도 자체가 코드 설계의 문제일 가능성이 높다. 안전한 라이브러리나 모듈을 통해 필요한 기능을 구현하는 편이 대부분 더 권장된다. === PHP === [[PHP]]에서는 '''eval()''' 함수를 사용하여 PHP 코드 문자열을 실행할 수 있다. PHP 역시 사용자 입력이나 파일에서 가져온 문자열을 직접 '''eval()'''에 넘길 경우 심각한 보안 취약점이 발생할 수 있으므로, 서버사이드에서 이를 사용할 때는 각별한 검증 절차가 필요하다. '''기본 사용''' <syntaxhighlight lang="php"> // 간단한 계산 eval('echo 2 + 3;'); // 출력: 5 // 변수 사용 $x = 10; eval('$result = $x * 2;'); echo $result; // 출력: 20 // 함수 정의 eval(' function multiply($a, $b) { return $a * $b; } '); echo multiply(4, 5); // 출력: 20 </syntaxhighlight> PHP의 '''eval()'''에서 주의할 점은, 구문 오류가 있을 경우 런타임 에러가 발생해 코드 실행이 중단될 수 있다는 것이다. 또한 오타나 악의적인 코드를 포함한 문자열이 그대로 실행되므로, 실 서버 환경에서 사용 시에는 필터링, 이스케이프, 혹은 다른 로직으로 대체하는 것을 강력히 권장한다. === Ruby === [[Ruby(프로그래밍 언어)|Ruby]]에서는 '''eval()''' 메서드를 사용하여 Ruby 코드 문자열을 실행할 수 있다. 메서드 이름 그대로 문자열을 평가하여 결과를 반환하며, 동적 메서드 정의나 클래스 생성을 가능하게 한다. '''기본 예제''' <syntaxhighlight lang="ruby"> # 간단한 계산 eval("2 + 2") # 결과: 4 # 문자열 조작 str = "hello" eval("str.upcase") # 결과: "HELLO" # 클래스 정의 eval(" class MyClass def initialize(name) @name = name end def greet puts \"Hello, #{@name}!\" end end ") obj = MyClass.new("Ruby") obj.greet # 출력: Hello, Ruby! </syntaxhighlight> 동적으로 코드를 생성하여 실행하는 것은 매우 유연하지만, 역시나 보안 취약점이 될 수 있으므로 외부 데이터를 그대로 '''eval()'''에 넘기는 일은 피해야 한다. 또한 유지보수성 측면에서 코드를 명시적으로 작성하는 방법이 훨씬 낫다는 점을 잊지 말아야 한다. === 그 외 언어에서의 예시 === * '''Perl''': <code>eval</code> 블록을 이용해 문자열 코드를 실행하거나 예외 처리를 위해 사용한다. 마찬가지로 외부 입력을 사용할 경우 세심한 검증이 필요하다. * '''C#''': 기본적으로 '''eval()'''에 해당하는 내장 함수는 없지만, '''Roslyn''' 컴파일러 API나 <code>CSharpCodeProvider</code> 등을 이용해 런타임에 코드를 컴파일하여 실행하는 유사 기능을 구현할 수 있다. * '''Java''': 자바 역시 '''eval()'''에 해당하는 직접적인 함수는 없으며, 동적 클래스 로더나 '''JavaCompiler''' API 등을 사용해 런타임에 코드를 컴파일, 로드, 실행하는 방식을 취할 수 있다. === 독립 환경에서의 eval 유사 동작 === 몇몇 언어들에서는 표준 '''eval()''' 함수를 직접 제공하지 않더라도, 외부 프로세스를 호출하는 방식으로 유사한 효과를 낼 수 있다. 예를 들어, 파이썬의 '''subprocess''' 모듈이나 Node.js의 '''child_process''' 모듈은 시스템 셸을 통해 명령어를 실행할 수 있으므로, 사실상 문자열을 코드로 해석하고 실행하는 것과 유사한 동작을 수행한다. * 파이썬의 '''subprocess.run()''' 또는 '''subprocess.Popen()''' 사용 시, <code>shell=True</code> 옵션을 부주의하게 설정하면 외부 입력이 셸 명령어로 실행되어 보안 문제가 생길 수 있다. * Node.js의 '''child_process.exec()''' 또한 임의의 시스템 명령어를 실행할 수 있어, 공격자가 임의 코드를 실행하도록 악용할 소지가 있다. 이러한 방법은 표준 eval 함수와는 달리 별도의 터미널/cmd 환경을 거치지만, 결국 런타임에 문자열로 된 명령어를 실행한다는 점에서 '''eval()''' 함수와 유사한 보안 위험이 존재한다. 따라서 '''eval()'''을 직접 사용하든, 혹은 프로세스 호출 방식을 사용하든 외부 입력 검증 및 샌드박싱이 중요한 보안 포인트가 된다. 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림)