2009-12-03 5 views
83

My Spider Sense는 들어오는 JSON을 구문 분석 할 때 eval()을 사용하는 것이 좋지 않다는 경고를받습니다. 그냥 JSON.parse() - 브라우저의 특정 기능이 아닌 JavaScript의 일부라고 생각하면 더 안전합니다.JSON.parse vs. eval()

답변

97

당신은 더 취약 등 (인라인 문서 here에 대한 추가 정보를 원하시면 예) 날짜 시간 등의 특정 값을 처리하는 방법을 지정할 수 있도록하는이 추가적으로 매개 변수, 자극성을 받아 공격을 사용하는 경우 eval : JSON은 Javascript의 하위 집합이며 json.parse는 JSON을 구문 분석하지만 eval은 모든 JS 표현식에 대해 문을 열어 둡니다.

+0

* "공격에 더 취약합니다"*, 완전히 동의하지 않습니다! – Hydro

+2

죄송합니다, Matheus, 동의해야합니다. 문제는 eval()을 사용하여 JavaScript에서 외부 소스 인 "사용자 입력"을 해석 할 때 (호출 한 서블릿 또는 다른 웹 서비스의 반환 값 포함)입니다.사용자가 클라이언트 응용 프로그램에 직접 악의적 인 JavaScript를 입력하지 않았거나 서버 데이터베이스에 저장된 유효성이 확인되지 않은 데이터로 인해 간접적으로 AJAX 스타일의 호출을 통해 프로그램에 전달 된 경우에도 악의적 인 JavaScript가 입력되지 않았 음을 보장 할 수 없습니다. "혼란스러운 대리"공격을 피하기 위해 개별 필드의 유효성을 검사해야하지만 JSON.parse를 사용하는 것이 좋은 첫 번째 단계입니다. – JackLThornton

+0

@Hydro 짧은 개념 증명 :'eval ('alert (1)');'을 시도하십시오. –

4

JSON은 자바 스크립트의 일부입니다. 그러나 eval은 JSON 인 서브셋이 아닌 전체 자바 스크립트 언어를 평가합니다.

+0

맞아요, 저도 압니다. JSON.parse()가 JSON 만 평가하고 다른 모든 들어오는 데이터는 실패 함을 의미합니까? 또는 단순히 래퍼입니다 : var myObject = eval ('('+ 'responseText +') '); ?? –

+5

@Kevin Major : 네, 기본적으로 구현 된 JSON.parse (자바 스크립트 엔진에 직접 구현)는 JSON 만 구문 분석합니다. 그러나 다른 비 고유 구현은 성능상의 이유로 일부 정상 검사를 사용하고 'eval'을 사용합니다. – Gumbo

9

eval으로 JSON을 구문 분석하면 구문 분석중인 문자열에 절대적으로 아무 것도 포함 할 수 없으므로 데이터 집합이 아니라 함수 호출 등을 수행 할 수 있습니다. 또한

, JSON의 parse 당신이

13

모든 브라우저가 기본 JSON을 지원하지는 않으므로 eval()을 JSON 문자열에 사용해야하는 경우가 있습니다. http://json.org의 JSON 파서를 사용하면 모든 것을 훨씬 쉽게 처리 할 수 ​​있습니다.

Eval()은 악이지만 일부 브라우저는 악의를 품지 만 피할 수있는 곳은 없으므로 !!!!!

29

모든 JSON.parse 구현은 대부분 eval()

JSON.parseline 497에 바로 eval()를 사용 Douglas Crockford's solution, 기반으로 사용합니다.

// In the third stage we use the eval function to compile the text into a 
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity 
// in JavaScript: it can begin a block or an object literal. We wrap the text 
// in parens to eliminate the ambiguity. 

j = eval('(' + text + ')'); 

JSON.parse의 장점은 인수가 올바른 JSON 구문 인 것을 확인한다.

+50

예, 그 전에는 안전하고 유효한 문자열이라는 것을 확인하는 것을 제외하고는. – nickf

+3

필자는 Firefox 28과 Linux Mint 시스템의 Chromium 33에서'JSON.parse()'를 테스트했습니다. 파이어 폭스에서는'eval()'의 2 배, Chromium에서는 4 배 빠릅니다. 내가 게시하는 소스 코드가 무엇인지 모르겠지만 브라우저에서 똑같은 것은 아닙니다. – jbo5112

+0

@plodder "이점"은 아마 검증하는 것을 싸게하지 않습니다. – momomo

9

JSON.parse()와 eval()이 수용하는 것의 차이가 있습니다. "{shoppingCartName \"\ "shopping_cart : 2000 \

VAR X =을 \": "}"이에 대한 평가 시도

eval(x)   //won't work 
JSON.parse(x) //does work 

example를 참조하십시오.

+1

eval은 문자열을 코드 문으로 구문 분석하므로 값 선언 식 대신 코드 식으로 "{...}"을 고려하므로 eval이 작동하지 않습니다. 모호성 (예 : "[{....}")을 제거하면 식의 특성에 의심의 여지가 없으며 eval은 구문 분석 된 objet –

+1

예를 포함하는 배열을 만듭니다. 전통적으로, x는 괄호로 둘러 쌉니다 : eval ("("+ x + ")"). 내가 말한 것은 아직 남아 있습니다 : JSON.parse()를 사용할 때 애매 모호하지 않습니다. –