eval은 JavaScript 코드에서 문자열을 실행할 수 있는 기능을 제공하지만, 보안상 위험과 디버깅 어려움, 성능 저하 등의 이유로 사용을 피하는 것이 좋습니다. 대신 new Function()을 사용하여 문자열을 함수로 실행하는 방법을 사용하면 보다 안전하게 코드를 실행할 수 있습니다. 이 문서는 eval을 new Function()으로 변경하는 방법을 안내합니다.
eval 사용 예시
let x = 10;
let code = "x + 5";
let result = eval(code);
console.log(result); // 15
위 예시에서 eval은 문자열로 제공된 JavaScript 코드를 실행하여 결과를 반환합니다. 그러나 eval은 다양한 보안 위험을 초래할 수 있습니다.
new Function() 사용 예시
new Function()은 문자열을 함수로 감싸서 실행하는 방법입니다. eval보다 상대적으로 더 안전한 방법으로 코드 실행을 제공합니다. new Function()은 다음과 같이 사용할 수 있습니다.
let x = 10;
let code = "x + 5";
let func = new Function('return ' + code);
let result = func();
console.log(result); // 15
new Function()은 실행할 코드 문자열을 함수로 감싸며, 이 경우에는 return을 명시적으로 추가해야 합니다.
eval을 new Function()으로 변경하는 단계
단계 1: eval로 실행하려는 코드 문자열 추출
먼저 eval에서 사용되는 코드 문자열을 new Function()에서 사용할 수 있는 형태로 변환합니다. 예를 들어, eval에서 x + 5처럼 계산하는 코드가 있다면, 이 코드 문자열을 그대로 new Function()으로 넘길 수 있습니다.
단계 2: eval에서 실행되는 코드에 return 추가
new Function()은 실행하는 코드에서 값을 반환하려면 return 키워드를 사용해야 합니다. 따라서 eval에서 계산된 값을 new Function()으로 변환할 때는 반환값을 명시적으로 지정해야 합니다.
단계 3: 변수 접근 방식 변경
eval은 해당 코드가 실행되는 범위에서 변수를 직접 참조할 수 있지만, new Function()은 별도의 함수 범위 내에서 실행됩니다. 필요한 변수는 new Function()에 인자로 넘겨줘야 합니다.
예시:
eval 사용:
let x = 10;
let code = "x + 5";
let result = eval(code);
console.log(result); // 15
new Function()으로 변경:
let x = 10;
let code = "x + 5";
let func = new Function('x', 'return ' + code); // 'x'를 매개변수로 추가
let result = func(x); // x 값을 전달
console.log(result); // 15
위와 같이 new Function()은 코드 내에서 외부 변수를 참조하지 않기 때문에, 필요한 변수를 함수의 매개변수로 전달해야 합니다.
변경 시 고려사항
- 보안: eval은 실행되는 코드가 악의적일 경우 심각한 보안 문제를 초래할 수 있습니다. new Function() 역시 외부 입력을 사용하기 전에 반드시 검증해야 합니다.
- 디버깅: eval은 디버깅이 어려운 특성이 있습니다. new Function()은 함수로 변환되기 때문에 디버깅이 조금 더 용이할 수 있습니다.
- 성능: eval은 실행 시에 파싱 및 컴파일 작업이 필요하므로 성능에 영향을 줄 수 있습니다. new Function()은 상대적으로 성능에 영향을 덜 미칩니다.
예외 처리
new Function()을 사용할 때 코드가 잘못된 경우 예외가 발생할 수 있습니다. 이를 처리하기 위해 try-catch 문을 사용할 수 있습니다.
let code = "x + 5";
try {
let func = new Function('x', 'return ' + code);
let result = func(10);
console.log(result);
} catch (e) {
console.error('Error executing code:', e);
}
결론
- eval을 사용할 필요가 있을 때 new Function()을 사용하면 보안성과 성능 측면에서 더 안전한 대안을 제공합니다.
- 코드를 new Function()으로 변경할 때는 변수를 매개변수로 전달하는 점에 유의해야 합니다.
- eval 사용을 최소화하고, 필요하다면 new Function()을 통해 동적으로 코드를 실행할 수 있는 방법을 적용하는 것이 바람직합니다.
'Web > Web 보안' 카테고리의 다른 글
Apache HTTP Server 버퍼오버플로우 취약점(CVE-2021-44790) (0) | 2021.12.29 |
---|---|
관리자 계정명 관리 취약점 (0) | 2020.05.12 |
관리자 콘솔 관리 취약점 (0) | 2020.05.12 |
[Xss] Lucy를 이용한 Request Body 크로스사이트스크립팅 제어 (0) | 2020.03.13 |
Error Page의 Response Header 고정 (1) | 2019.07.31 |