2010-03-23 2 views
7

질문 : eval을 사용하여 WebMethod 중 하나에서 JSON 반환 값을 파싱했습니다.

전송 볼륨이 이미 상당히 크기 때문에 jquery-json을 추가하지 않는 것이 좋습니다. 그래서 JSON 반환 값을 eval로 파싱합니다.
이제는 이것이 안전하지 않다는 소문이 있습니다. 왜 ?

내 서버를 해킹하지 않는 한 아무도 JSOn 반환 값을 수정할 수 없습니다. 어쨌든 훨씬 큰 문제가 발생할 수 있습니다.

로컬로 처리하는 경우 JavaScript는 브라우저에서만 실행됩니다.
그래서 문제가 어디에 있는지 알 수 없습니다.

누구나이 구체적인 예를 사용하여 이에 대해 밝힐 수 있습니까?JavaScript eval을 사용하여 JSON 구문 분석

function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
{ 
    var result=eval('(' + JSONstrWebMethodReturnValue + ')') 
    ... // Adding result.xy to a table 
} 

답변

14

근본적인 문제는 eval는, 자바 스크립트 실행 단지 JSON 형식의 데이터를 역 직렬화 할 수 없다는 것입니다. 신뢰할 수 없거나 반 신뢰 된 소스에서 JSON을 처리 할 때 위험합니다. JSON을 괄호로 묶는 빈번한 트릭은 임의의 JavaScript가 실행되지 않도록하기에 충분하지 않습니다. 자바 스크립트 -

var result = eval("(" + x + ")"); 

... 당신은 경고를 볼 것 : 당신과 변수 x이했던 것을 가지고 있다면

function(){alert('Hi')})(

: 어떤 정말되지 않습니다 "JSON"을 고려 도망 갔다. 보안 문제.

귀하의 데이터가 신뢰할 수있는 출처에서 왔고 (있는 것처럼 들린다면) 나는 그다지 걱정하지 않을 것입니다. 즉, Crockford의 토론 here (Crockford는 JSON의 발명가이자 일반적으로 지식이 풍부한 JavaScript 사용자)에 관심이있을 수 있습니다. Crockford는 또한 적어도 세 개의 퍼블릭 도메인 파서를 this page에 제공합니다. 그의 json2.js 파서와 문자열 화기는 크기가 2.5k에 불과하지만 여전히 eval을 사용합니다 (몇 가지 예방 조치가 먼저 필요함). 그의 json_parse.js는 eval을 사용하지 않는 재귀 적 파서입니다. 및 상태 머신 파서 인 json_parse_state.js (다시 eval을 사용하지 않음). 그래서 당신은 독약을 골라야합니다. (그 마지막 두 가지 대안을 지적 Camilo Martin에게 외쳐.)

+4

Crockford의 JSON에는 'eval'을 사용하지 않는 다른 구문 분석 모드가있는 두 개의 다른 라이브러리 (주 json.js 및 json2.js 제외)가 포함되어 있습니다. 그것들은'json_parse.js'와'json_parse_state.js'이며 찾을 수 있습니다 (https://github.com/douglascrockford/JSON-js/) –

+0

@Camilo : 훌륭합니다, 고마워요! –

+0

외부 소스로부터 입력이 없으므로 eval을 안전하게 사용할 수 있다고 말하는 것이 좋습니다. –

4

점점 JSON 구문 분석 및 인코딩이 현대적인 브라우저에서 기본적으로 제공되며, [wikipedia reference]이 추가 라이브러리를로드 할 필요없이 응용 프로그램 보안 JSON 기능을 제공합니다 . framewok를 통해 사용할 수

var native_JSON_exists = typeof window.JSON === 'object'; 

(위, TJ 크라우로 연결) 더글라스 크록 포드의 것과 같은 JSON 파싱 라이브러리를로드해야 또는 기능 :이 같은 작업을 수행하여 네이티브 JSON 지원을 테스트 할 수 있습니다

네이티브 지원이없는 브라우저의 경우 (하지만 당신은 적어도 그것을 지원하는 브라우저에서 네이티브 JSON을 사용하여 최신 브라우저를 사용할 수있는 운 좋은 사용자를 보호해야합니다.)

JSON은 JavaScript 구문의 하위 집합이므로 JavaScript 평가 문에서 작동하는 문자열은 적절한 JSON 구문 분석에서 작동하지 않습니다.JSLint (http://www.jslint.com/)를 사용하여 JSON 문자열에서 오류를 테스트 할 수 있습니다.

+1

+1하지만 슬프게도 원주민 지원은 여전히 ​​중요한시기에 준비가되어 있지 않습니다. 너무 많은 구현 버그 (놀랍게도). 그러나 그것은 거기에 도착할 것이다. –

+0

@ T.J. 무슨 버그 야? –

+0

@Camilo : 예를 들어 [this one] (http://stackoverflow.com/questions/1288962/ie8-native-json-parse-bug-causes-stack-overflow)이 있습니다. 프로토 타입과 jQuery 라이브러리에 관련된 사람들의 의견을 다른 사람들에게도 들었을 것이라고 확신한다. 가까운 장래에, 나는 아마도 json2.js 나 (신뢰할 수없는 또는 반 신뢰되는 소스의 데이터를 파싱 할 경우) 당신이 지적한 non-eval json_parse.js 및 json_parse_state.js 대안을 고수 할 것입니다. Crockford의 [github 페이지] (https://github.com/douglascrockford/JSON-js/). –