
JSON과 유사한 콘텐츠가 주어지면, The JSON Sanitizer는 이를 유효한 JSON으로 변환합니다.
JSON과 유사한 콘텐츠가 주어지면 JSON Sanitizer는 이를 유효한 JSON으로 변환합니다.
이는 데이터 파이프라인의 양쪽 끝에 연결하여 Postel의 원칙을 충족시키는 데 도움이 될 수 있습니다.
자신이 하는 일에는 보수적으로, 다른 사람에게서 받아들일 때는 관대하게
다른 사람에게서 받은 JSON과 유사한 콘텐츠에 적용하면, 사용 중인 모든 파서를 만족시킬 수 있는 잘 구성된 JSON을 생성합니다.
보내기 전에 출력에 적용하면, 인코딩의 사소한 오류를 강제로 수정하고 JSON을 HTML 및 XML에 더 쉽게 포함시킬 수 있습니다.

많은 애플리케이션은 JSON 출력을 생성하기 위해 임시 방식을 사용하는 대규모 코드를 가지고 있습니다.
종종 이러한 출력은 모두 네트워크로 전송되기 전에 소량의 프레임워크 코드를 통과합니다. 이 소량의 프레임워크 코드는 이 라이브러리를 사용하여 임시 출력이 표준을 준수하고 Javascript의 eval 연산자와 같은 (지나치게) 강력한 역직렬화기에 전달해도 안전한지 확인할 수 있습니다.
또한 애플리케이션은 다양한 소스에서 JSON을 수신하는 웹 서비스 API를 가지고 있는 경우가 많습니다. 이 JSON이 임시 방식으로 생성된 경우, 이 라이브러리는 구문 분석하기 쉬운 형태로 가공할 수 있습니다.
이 라이브러리를 요청 및 응답을 송수신하는 코드에 연결함으로써, 이 라이브러리는 소프트웨어 아키텍트가 시스템 전반의 보안 및 올바른 형식 보장을 보장하는 데 도움을 줄 수 있습니다.
새니타이저는 JSON과 유사한 콘텐츠를 가져와 JS eval이 평가하는 방식으로 해석합니다. 특히, 다음과 같은 비표준 구문을 처리합니다.
| 구조 | 정책 |
|---|---|
'...' | 작은따옴표 문자열은 JSON 문자열로 변환됩니다. |
\xAB | 16진수 이스케이프는 JSON 유니코드 이스케이프로 변환됩니다. |
\012 | 8진수 이스케이프는 JSON 유니코드 이스케이프로 변환됩니다. |
0xAB | 16진수 정수 리터럴은 JSON 10진수 숫자로 변환됩니다. |
012 | 8진수 정수 리터럴은 JSON 10진수 숫자로 변환됩니다. |
+.5 | 10진수 숫자는 JSON의 더 엄격한 형식으로 강제 변환됩니다. |
[0,,2] | 배열의 생략은 null로 채워집니다. |
[1,2,3,] | 후행 쉼표가 제거됩니다. |
{foo:"bar"} | 따옴표가 없는 속성 이름은 따옴표로 처리됩니다. |
//comments | JS 스타일의 한 줄 및 블록 주석이 제거됩니다. |
(...) | 그룹화 괄호가 제거됩니다. |
새니타이저는 누락된 구두점, 종료 따옴표, 일치하지 않거나 누락된 닫는 괄호를 수정합니다. 입력에 공백만 포함된 경우 유효한 JSON 문자열 null이 대체됩니다.
출력은 RFC 4627에 정의된 잘 구성된 JSON입니다. 출력은 다음과 같은 추가 속성을 충족합니다.
"<script", "</script" 또는 "<!--"이 포함되지 않으므로 추가 인코딩 없이 HTML 스크립트 요소 내에 포함될 수 있습니다."]]>"이 포함되지 않으므로 추가 인코딩 없이 XML CDATA 섹션 내에 포함될 수 있습니다.eval 내장 함수(괄호로 감싼 후) 또는 JSON.parse로 구문 분석할 수 있습니다. 특히, 출력에는 포함된 JS 줄바꿈(U+2028 단락 구분자 또는 U+2029 줄 구분자)이 있는 문자열 리터럴이 포함되지 않습니다.출력이 잘 구성된 JSON이므로 eval에 전달해도 부작용이나 자유 변수가 없으므로 코드 인젝션 벡터나 비밀 유출 벡터가 아닙니다.
이 라이브러리는 JSON 문자열 → Javascript 객체 단계에 부작용이 없고 자유 변수를 해결하지 않도록 보장할 뿐이며, 다른 클라이언트 측 코드가 결과 Javascript 객체를 나중에 어떻게 해석할지는 제어할 수 없습니다. 따라서 클라이언트 측 코드가 공격자가 제어하는 구문 분석된 데이터의 일부를 가져와 eval 또는 innerHTML과 같은 강력한 인터프리터에 다시 전달하면 해당 클라이언트 측 코드는 의도하지 않은 부작용을 겪을 수 있습니다.
var myValue = eval(sanitizedJsonString); // 안전
var myEmbeddedValue = eval(myValue.foo); // 잠재적으로 안전하지 않음
또한 JSON을 새니타이징한다고 해서 애플리케이션이 혼동된 대리자 공격으로부터 보호되지는 않습니다.
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
sanitize 메서드는 입력이 이미 위의 속성을 충족하는 유효한 JSON인 경우 새 버퍼를 할당하지 않고 입력 문자열을 반환합니다. 따라서 일반적으로 잘 구성된 입력에 사용하면 메모리 오버헤드가 최소화됩니다.
sanitize 메서드는 입력의 UTF-16 코드 단위 길이인 n에 대해 O(n) 시간이 걸립니다.