[javascript] JavaScript eval 함수를 사용하는 것이 나쁜 생각 인 이유는 무엇입니까?

eval 함수는 코드를 동적으로 생성하는 강력하고 쉬운 방법이므로주의해야 할 점은 무엇입니까?



답변

  1. eval을 부적절하게 사용하면 주입 공격에 대한 코드가 열립니다.

  2. 디버깅 은 더 어려울 수 있습니다 (행 번호 등 없음)

  3. eval’d 코드가 느리게 실행 됨 (eval’d 코드를 컴파일 / 캐시 할 기회 없음)

편집 : @ Jeff Walden이 의견에서 지적했듯이 # 3은 2008 년보다 오늘날에는 덜 사실입니다. 그러나 컴파일 된 스크립트의 일부 캐싱이 발생할 수 있지만 수정없이 반복되는 스크립트로만 제한됩니다. 더 가능성이 높은 시나리오는 매번 약간 씩 수정 된 스크립트를 평가하여 캐시 할 수 없다는 것입니다. 일부 평가 된 코드가 더 느리게 실행된다고 가정 해 봅시다.


답변

평가가 항상 악한 것은 아닙니다. 완벽하게 적절한 때가 있습니다.

그러나 평가는 현재 그리고 역사적으로 자신이하는 일을 모르는 사람들에 의해 과도하게 사용되고 있습니다. 불행히도 JavaScript 자습서를 작성하는 사람들이 포함되며 경우에 따라 보안에 영향을 줄 수 있습니다. 따라서 eval에 물음표를 던질수록할수록 좋습니다. eval을 사용할 때마다 수행중인 작업의 위생 상태를 점검해야합니다. 더 안전하고 깔끔한 방법으로 수행 할 수 있기 때문입니다.

변수를 ‘potato’에 저장 한 id로 요소의 색상을 설정하려면 일반적인 예를 들자면 :

eval('document.' + potato + '.style.color = "red"');

위와 같은 코드의 작성자가 JavaScript 객체의 작동 원리에 대한 단서가 있었다면 리터럴 점 이름 대신 대괄호를 사용할 수 있다는 사실을 깨달았을 것입니다.

document[potato].style.color = 'red';

… 읽기가 훨씬 쉬우 며 버그가 적습니다.

(그러나, 자신이하고있는 일을 / 정말로 / 알고있는 사람은 :

document.getElementById(potato).style.color = 'red';

문서 객체에서 DOM 요소에 직접 액세스하는 오래된 트릭보다 더 안정적입니다.)


답변

문자열에서 JavaScript 함수를 실행할 수 있기 때문이라고 생각합니다. 이를 사용하면 사람들이 악성 코드를 응용 프로그램에 쉽게 삽입 할 수 있습니다.


답변

두 가지 점이 생각납니다.

  1. 보안 (하지만 직접 평가할 문자열을 생성하는 한, 이것은 문제가되지 않을 수 있음)

  2. 성능 : 실행될 코드를 알 수 없을 때까지 최적화 할 수 없습니다. (자바 스크립트 및 성능, 확실히 Steve Yegge의 프레젠테이션 )


답변

사용자 입력을 eval ()에 전달하는 것은 보안 위험이지만 eval ()을 호출 할 때마다 JavaScript 인터프리터의 새 인스턴스가 작성됩니다. 이것은 자원 돼지 일 수 있습니다.


답변

일반적으로 평가판 사용자 입력을 전달하는 경우에만 문제가됩니다.


답변

주로 유지 관리 및 디버그가 훨씬 어렵습니다. 그것은 같다 goto. 사용할 수는 있지만 나중에 변경해야 할 사람들에게 문제를 찾기 어렵고 어렵게 만듭니다.