본문 바로가기
Web Security/SecureCoding

JS) eval() 을 사용하면 안되는 이유

by KkingKkang 2023. 2. 1.

 

  • 연산식을 계산하기 위해 eval()을 호출하지 말 것 
  • 문자열로부터 eval()을 실행하는 것은 엄청나게 위험함. eval()을 사용하면 해커가 위험한 코드를 사용할 수 있다.
  • eval()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수
  • 또한, 최신 JS엔진에서 여러 코드 구조를 최적화 하는 것과 달리 eval()은 JS인터프리터를 사용해야 하기 때문에 다른 대안들보다 느리다. 
  • 최신 JavaScript 인터프리터는 자바스크립트를 기계 코드로 변환한다. 즉, 변수명의 개념이 완전히 없어진다.
  • 그러나 eval을 사용하면 브라우저는 기계 코드에 해당 변수가 있는지 확인하고 값을 대입하기 위해 길고 무거운 변수명 검색을 수행해야 한다. 
  • 또한 eval()을 통해 자료형 변경 등 변수에 변화가 일어날 수 있으며, 브라우저는 이에 대응하기 위해 기계 코드를 재작성해야 한다. 
  • eval()대신 window.Function이라는 대안을 사용해보자 
//eval 을 사용하는 나쁜 코드

function looseJsonParse(obj) {
	return eval(obj);
}

console.log(looseJsonParse(
	"{a:(4-1), b:function(){}, c:new Date()}"
))
//eval이 없는 코드

function looseJsonParse(obj){
	return Function('"use strict"; return (' + obj + ')')();
}

console.log(looseJsonParse(
	"{a:(4-1), b:function(){}, c:new Date()}"
 ))

 

출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval

 

eval() - JavaScript | MDN

**eval()**은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.

developer.mozilla.org

 

 

반응형

'Web Security > SecureCoding' 카테고리의 다른 글

SQL 삽입 공격 : Hibernate  (0) 2023.02.01
안전하지 않은 리플렉션  (2) 2023.02.01
적절한 인증 없는 중요기능 허용  (0) 2022.11.21
무결성 점검 없는 코드 다운로드  (0) 2022.11.21
프로세스 제어  (0) 2022.11.18

댓글