2012-04-25 2 views
3

우리는 추가 보안 수준으로 json에 대한 분석 할 수없는 구불 구불 한 접근 방식을 사용하고 있습니다.평가할 수없는 ("unparsable cruft") JSON을 작성하여 보안을 강화 하시겠습니까?

Google의 접근 방식을 살펴보면 Google의 while(1);과 Facebook의 for(;;)을 발견했습니다. 그리고 나서 또 다른 언급은 {}&&

while(1); 나는 숫자가 1이 숫자가 될 수 있다고 말한 것을 보았습니다. 그래서 접근 방식은 for(;;);이 될 것입니다.

그렇다면 {}&&을 보았습니다. json이 유효하지 않은 것으로 렌더링되었지만 여전히 파싱/평가 될 수 있습니다. 참조를 위해이 기사를 참조하십시오. http://www.sitepen.com/blog/2008/09/25/security-in-ajax/

어떤 방법을 사용합니까? 그리고 분석 할 수없는 선반으로 아약스 전화를 할 때 당신의 기능은 어떻게 생겼을까요?

+0

이들 중 아무 것도 JSON과 관련이 없습니다. 누군가가'eval'을 사용하기를 원한다면 접근법을 수정하는 부담은 전적으로 ... 또한 JSON 구문 분석이 브라우저에 널리 퍼지지 않은 2008 년 기사 기사입니다. 오늘은 표준'JSON.parse'이거나 심 (shim)으로 쉽게 사용할 수 있습니다. 나는 그러한 "안전"조치를 취하지 않을 것입니다. –

+0

"unparsable cruft"와 관련된 두 가지 게시물 : http://stackoverflow.com/questions/3503102/what-are-top-level-json-arrays-and-why-are-they-a-security-risk, http : //stackoverflow.com/questions/3146798/why-do-people-put-code-like-throw-1-dont-be-evil-and-for-in-front-of –

+0

(실제로는 배열 생성자 도용 접근법은 * any 배열이 있다면 "unparsable cruft"를 사용하는 경우에도 유효합니다.) –

답변

2

저는 항상 루트 객체 만 사용합니다. 언급 된 바와 같이 :

배열 인 루트를 사용하여 JSON 데이터를 하이재킹 할 수 있습니다. 루트가 프리미티브 인 경우 프리미티브 값은 생성자를 트리거하지 않습니다. 루트가 객체 일 때 유효한 JavaScript 구문이 아니므로 구문 분석 할 수 없습니다.

루트 프리미티브 (예 : 응답은 5)를 사용하는 것은 유효한 JSON이 아닙니다. the RFC의 섹션 2는 다음과 같이 말합니다 :

JSON 텍스트는 직렬화 된 개체 또는 배열입니다. I (많은 사이트) 일반적으로 봉투 형식을 사용으로

JSON-text = object/array 

이, 부담이 많이 없습니다. 예컨대 :

{ 
    "header": {...}, 
    "data": {...} 
} 

나 : 당신이 어떤 납치 위험없이 구문 적으로 유효한 JSON 서비스를 제공 할 수 있도록이 경우

{ 
    "status": {...}, 
    "data": {...} 
} 

, 어떤 배열은, 데이터의 값이 될 것입니다.

+0

위의 정보/인용문은 어디에서 받았습니까? – Jason

+1

@Jason, RFC를 제외하고 연결된 기사에서. 그러나 유사한 요지가 다른 곳에서도 만들어집니다. –

+0

나는 이것을 인터넷 아키텍트에게도 발표했다. 그러나 그들이 최고 수준의 opbjects를 가진 json 응답에서 하이재킹이 여전히 일어날 수 있음을 언급하는 다른 기사를 읽었다 고 언급했다. (이것은 모든 논점이 최상위 인수를 가지고 있다면, 사실 그걸로 안전 해집니다.) – Jason