2013-08-12 5 views
7

많은 개발자들은 JavaScript의 eval() 메소드를 피해야한다고 생각합니다. 이 아이디어는 디자인 관점에서 의미가 있습니다. 더 간단하고 더 나은 옵션을 사용할 수있는 경우 종종 추악한 해결 방법으로 사용됩니다.JavaScript의 eval() 메소드 사용하기

그러나 보안 취약점에 대한 우려는 이해하지 못합니다. 확실히 eval()을 실행하면 해커가 실행할 수있는 JavaScript 코드를 실행할 수 있습니다.

하지만 어쨌든이 작업을 수행 할 수 없습니까? Chrome에서는 최소한 개발자 도구를 사용하여 최종 사용자가 자체 JavaScript를 실행할 수 있습니다. eval()은 개발자 도구보다 어떤 위험이 있습니까?

+2

그건 "일반적인 합의"가 아닙니다. 경험 많은 개발자는 FUD가'eval'에 대해 짜증을냅니다. * "eval is evil"*은 오늘날 경험이 많은 코더가 말한 적이 없을 것입니다. 바보라면 위험 할 수 있습니다. 하지만 대개 느리고 못생긴 코드를 개발하기가 어렵습니다. –

+0

이제이 질문이 좋은 대답을 얻는 방법을 모르겠습니다 ... –

답변

11

B-Con은 컴퓨터에 앉아있는 사람이 아니므로 스크립트에 eval()을 사용하여 악의적 인 코드를 사용자의 현재 세션을 악용하기위한 수단으로 사용할 수 있습니다. (예 : 악의적 인 링크를 따르는 사용자).

eval()의 위험성은 unsanitised 값으로 실행될 때 발생하며 DOM Based XSS 취약점이 발생할 수 있습니다.

(오히려 인위적인, 그러나 나는 희망을 문제를 보여줍니다) HTML에서 다음 코드를 고려 쿼리 문자열이 ?foo 당신이 단순히 알리는 경고 대화 상자를 얻을 다음과 같은 경우에 지금

<script> 

eval('alert("Your query string was ' + unescape(document.location.search) + '");'); 

</script> 

을 : Your query string was ?foo

하지만 이 코드는 사용자가 자신의 사이트에서 http://www.example.com/page.htm?hello%22);alert(document.cookie+%22과 같은 URL로 사용자를 리디렉션하는 것을 허용합니다. 여기서 www.example.com은 귀하의 웹 사이트입니다.

alert("Your query string was hello"); 
alert(document.cookie+""); 

(명확성을 위해 나를 추가 한 새로운 라인)에 eval()에 의해 실행되는 코드를 수정합니다. 이제는 현재 코드 값을 표시하는 것보다 더 악의적 인 작업을 수행 할 수 있습니다. 필요한 코드가 공격자의 링크에 의해 인코딩 된 형식으로 쿼리 문자열에 전달되기 때문입니다. 예를 들어, 쿠키가 공격자의 도메인에 리소스 요청으로 전송되어 인증 세션이 도용 될 수 있습니다.

여기에 표시된 것과 같이 쿼리 문자열뿐만 아니라 eval()에서 직접 unsanitised되고 실행되는 사용자/외부 입력의 모든 값에 적용됩니다.

+0

이것은 의미가 있습니다. 나는'eval()'이 다른 사이트가 사용자 데이터를 긁어내는 것을 허락하는 것이 아니라 웹 사이트 자체에 해킹을 허용한다고 생각했다. –

+0

직접적으로는 아니지만 관리자 사용자를 대상으로하는 경우 가능합니다. – SilverlightFox

2

공격자는 사용자의 브라우저의 개발자 도구에 액세스 할 수 없습니다. 공격자는 사용자가 컴퓨터에 앉아 있지 않은 것 같습니다.

eval()의 위험은 공격자가 결국 다른 방법으로 eval()을 통해 실행되는 데이터를 조작 할 수 있다는 것입니다. eval() 문자열이 HTTP 연결에서 오는 경우 공격자는 MITM 공격을 수행하고 문자열을 수정할 수 있습니다. 문자열이 외부 저장소에서 오는 경우 공격자가 해당 저장소 위치의 데이터를 조작했을 수 있습니다. 등

+2

실제 문제는 사용자가 제공 한 모든 소스에서 오는 문자열입니다.MITM 공격은'eval'과 관련하여 항상 문제가 될 것입니다. 그들이 MITM을하고 있다면, 평범한 비표준 JS 페이로드를 쉽게 수정할 수 있습니다. – Matt

+1

또 다른 고전적인 예는'eval' GET 변수는 XSS 구멍을 여는 쉬운 방법입니다. 등. –

관련 문제