2009-07-17 3 views
4

보안 관점에서 볼 때 수신되는 JSON 데이터를 단순히 중요한 실수로 처리하는 것을 볼 수 있습니다. 아래 데이터가 있다면 몇 가지 문제가있을 것입니다.JSON 데이터 - 구문 분석 또는 'Eval'ed

{ someData:((function() { 
    alert("i'm in ur code hackin' ur page"); 
})()) } 

가장 인기있는 Javascript 라이브러리는 무엇을 할 수 있을까요? 수동 구문 분석입니까 아니면 단순히 평가입니까?

[편집]

내가 물어 아니에요 경우 I해야 평가/해석 - 나는 어떤 방법을 묻는 된 사용되는 인기있는 자바 스크립트 라이브러리 (jQuery를, 프로토 타입, 등)

의 일부

답변

7

가 여기에 official JavaScript parser가하는 작업은 다음과 같습니다를 제외

// In the second stage, we run the text against regular expressions that look 
// for non-JSON patterns. We are especially concerned with '()' and 'new' 
// because they can cause invocation, and '=' because it can cause mutation. 
// But just to be safe, we want to reject all unexpected forms. 

// We split the second stage into 4 regexp operations in order to work around 
// crippling inefficiencies in IE's and Safari's regexp engines. First we 
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we 
// replace all simple value tokens with ']' characters. Third, we delete all 
// open brackets that follow a colon or comma or that begin the text. Finally, 
// we look to see that the remaining characters are only whitespace or ']' or 
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. 

if (/^[\],:{}\s]*$/. 
    test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). 
    replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). 
    replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { 

// 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 parsing support,이 모든 (라이브러리 기반) 보안 JSON 파서가하는 일 (즉, 정규식 eval 전 시험).

안전 라이브러리

프로토 타입의 isJSON 기능 (공식 json2 구현에 추가).

Mootools 'JSON.decode 함수 (다시 regex test before eval 통해).

안전하지 않은 라이브러리 :

도장의 fromJson하지 하지 보안 eval ING를 제공합니다. Here is their entire implementation (minus comments) :

dojo.fromJson = function(json) { 
    return eval("(" + json + ")"); 
} 

jQuery를이 보내고 안전한 JSON eval '을 제공하지만, 공식 플러그인의 secureEvalJSON 기능 (라인 143)를 참조하지 않습니다. http://code.google.com/p/json-sans-eval/에서

+0

정규식 중 하나입니다. – Hugoware

+0

사실, 일부 JSON 파서는 정규식을 건너 뛰는 안전 모드가 있습니다. 이 모드는 빠르지 만 안전성이 떨어집니다. –

+0

@Henrik : 덜 안전하다면 왜 "안전 모드"라고 부릅니까? ;) –

0

대신 evalJSON()을 사용 하시겠습니까?
내가 아는 한 기본적으로 위생 점검 후에 eval()을 호출한다.

1

절대 파싱해야합니다! JSON은 자바 스크립트의 일부입니다. 그러나 eval은 JSON 파서처럼 특정 JavaScript 코드를 평가하지는 않습니다.

0

:

자바 스크립트에서의 빠르고 안전한 JSON 파서?

이 JSON 파서 json으로 유효성을 검사하지 않는, 그래서 결과가 구문 적으로 무효 입력을 부여 반환하지만, 평가 후면 사용하지 않기 때문에 결정 이며, 이외의 객체를 수정 하지 보장의 반환 값

JavaScript에 JSON 파서가 여러 개 있습니까? json.org에서.이 구현은 보안이 문제가 될 때 (JSON이 신뢰할 수없는 출처에서 온 경우 일 수 있음), 의 속도가 문제가 될 때마다 사용되어야하며 의 잘못된 JSON은 문제가되지 않습니다. 느린 보안

  • 단점이
  • json_parse.js

    에게
    • 프로 유효성을 검증하지

      이 구현 빠른

      • 프로, 보안
      • 단점 이 JSON 데이터를 구문 분석 평가 후면 호출 이후

      json2.js

      • 프로 빠른 일부 확인
      • 단점 잠재적으로 안전하지 않은

      json2.js는 안전하지 않은 매우 빠르지 만 잠재적으로 그래서 공격자는 이 JSON처럼 처럼 보이는 이상한 JS를 제공 할 수 있지만 임의로 실행합니다. javascript.

      당신이 그렇게 당신이 패치를 얻을 그들이 출시 있어 당신이 최신 json2.js의 버전을 유지해야합니다, 신뢰할 수없는 데이터와 json2.js를 사용해야하는 경우.