- [JS] 절대 사용하면 안되는 eval 함수에 대해 (프로그래머스 120902 문자열 계산하기)2024년 07월 08일
- 주사위 clice
- 작성자
- 2024.07.08.:47
반응형오늘은 무려 자바스크립트 공식 문서인 MDN에서 금기한 eval 함수에 대해 알아보자
프로그래머스 문제
얼마 전 프로그래머스 문제를 풀고 있었다 ( 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120902 )
대충 문자열로 식이 주어지면, 그 식을 풀고 값을 리턴하는 코드를 작성해야 했다
어려운 문제는 아니라서 아래와 같이 코드를 작성했고 통과를 했다
내가 작성한 코드
const solution=(my_string) => { let a=my_string.split(' ') //공백을 기준으로 문자열을 나눴다 let answer=Number(a[0]); //answer은 배열[0] 값, 즉 첫번째 숫자이다 for(let i=1; i<a.length; i+=2 //연산자는 배열의[1]값, 즉 홀수 인덱스의 값들이다. 그래서 for문에서 2씩 증가 (a[i]=='+')?(answer+=Number(a[i+1])):(answer-=Number(a[i+1])); //연산자가 +면 더하고 그게 아닌 경우는 -뿐이므로 뺀다 return answer; //정답 반환 }
이렇게 열심히 문제를 풀고 다른 사람의 풀이를 확인했다
그런데 너무 이상한 한 줄 짜리 코드를 발견했다
var solution = eval
eval 이 뭐길래 복잡한 문제가 한줄에 간단하게 풀린걸까?
eval 이 뭔데?
eval 함수는 문자열로 표현된 JavaScript 코드 자체를 실행해준다
예시를 한번 보자
let code = "console.log('Hello, World!')"; eval(code); // 결과: Hello, World! let math="2+1" eval(math); // 결과: 3
위 예시에서 각 변수에 있는 문자열을 eval 함수가 말 그대로 실행하여
콘솔에 "Hello, World!"를 출력하거나, 3을 계산하여 출력한다
이렇게 편한 eval 함수는 스크립트 자체를 읽어 실행하기 때문에
JavaScript, Python 같은 스크립트 언어라면 내장되어 있다
eval 함수의 위험성
하지만 eval 함수는 매우 위험할 수 있다.
eval 함수는 입력된 문자열을 그대로 실행하기 때문에, 악성 코드가 포함된 문자열도 실행될 수 있다.
userInput = 해킹 기능이 있는 스크립트; eval(userInput); // 결과: 해킹 기능이 있는 스크립트가 실행된다 ⚠️ let userData = "fetch('/private-data')"; eval(userData); // fetch 함수가 실행되어 비밀 데이터를 가져오는 코드가 실행된다 ⚠️
위 예제에서 사용자가 입력한 문자열이 악성코드일 경우, eval 함수는 이를 그대로 실행한다.
이는 큰 문제를 일으킬 수 있다.
이러한 이유로, eval 함수를 사용하지 않는 것이 좋다.
eval 함수에 대한 자세한 내용은 아래 MDN 공식 문서에서 더 자세히 읽어볼 수 있다
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval
ⓒ clice lee clicelee
클라이스의 개발일지주사위의 개발일지
반응형'프론트 > Javascript Typescript' 카테고리의 다른 글
[JS] 자바스크립트 약수 구하기 (Math.sqrt로 시간 복잡도 줄이기) (0) 2024.08.02 [JS] 로그인 성공? - 프로그래머스 120883 Map의 has get 메서드, some, 구조분해할당 (0) 2024.07.12 [자바스크립트] 캐릭터의 좌표 - 프로그래머스 120861 객체의 속성값 전달하여 변경하기 (0) 2024.06.19 [JS] 영어가 싫어요-프로그래머스 120894 (1) 2024.06.15 [JS] 7의 개수-프로그래머스 120912 join(' ') split(' ') filter() 함수 (0) 2024.06.06 다음글이전글이전 글이 없습니다.댓글