설명
Eval 주입(Eval Injection)은 사용자가 입력한 값을 JavaScript의 eval(), new Function() 또는 브라우저의 문자열 기반 setTimeout()·setInterval()에 코드로 전달할 때 발생하는 취약점입니다. 공격자는 악의적인 JavaScript 코드를 삽입하여 크로스 사이트 스크립팅(XSS) 공격과 같은 피해를 유발할 수 있습니다.
잠재적 영향
- 악성 스크립트 실행 (악성 코드 실행): 공격자가 페이지의 권한으로 악성 JavaScript를 실행하여 사용자 정보를 탈취하거나 사용자 대신 동작을 수행할 수 있습니다.
- 데이터 유출 (데이터 노출): 악성 스크립트를 통해 사용자의 민감한 데이터가 외부로 전송될 수 있습니다.
해결 방법
eval,new Function, 브라우저의 문자열 기반setTimeout·setInterval을 피하고 함수나 미리 정한 동작을 호출하세요.- 꼭 필요한 경우, 사용자 입력을 철저히 검증하고 허용되는 값만 처리하세요.
- 사용자 입력으로 코드가 직접 실행되는 구조 자체를 피하고, 안전한 비즈니스 로직만을 사용하세요.
예시
변경 전
javascript
// 비취약 예시
eval('alert("hi")'); // 직접 코드, 입력 없음
// 취약 예시
const param = new URLSearchParams(window.location.search).get('cmd');
eval(param); // 사용자가 cmd에 악성 코드를 삽입할 수 있음
변경 후
javascript
const allowed = ['showMessage', 'log']
const param = new URLSearchParams(window.location.search).get('cmd')
if (allowed.includes(param)) {
if(param === 'showMessage') alert('안녕하세요!')
if(param === 'log') console.log('로그 처리')
} else {
// 허용되지 않은 명령 거부
console.warn('잘못된 명령입니다.')
}
설명:
- 변경 전: 사용자 입력을 검증 없이 eval에 전달하면 공격자가 악의적인 코드를 삽입하여 실행할 수 있어 매우 위험합니다.
- 변경 후: 허용된 명령어만 실행하도록 제한하여, 사용자가 임의로 코드를 삽입하여 실행할 수 없게 만듭니다. 동적 실행 함수(eval 등)은 사용하지 않습니다.