it-source

JSON을 소독할 필요가 있습니까?

criticalcode 2023. 2. 22. 22:15
반응형

JSON을 소독할 필요가 있습니까?

웹에서 어떤 입력도 믿지 않는 것은 잘 알려진 베스트 프랙티스라고 생각합니다.문장은

"모든 입력은 악하다."

입력 검증에 관해 가장 많이 인용된 인용문일 것입니다.HTML의 경우 DOMPurify 등의 도구를 사용하여 삭제할 수 있습니다.

질문입니다만, JSON을 수신 및 해석하기 위해 Express를 실행하고 있는 Node.js 서버와 Body-parser 미들웨어가 있는 경우, 검사도 실행할 필요가 있습니까?

이것에 대한 나의 (아마도 순진한가?) 생각은 JSON은 데이터일 뿐 코드는 없다.누군가 무효인 JSON을 송신했을 경우, Body-parser(이것이JSON.parse()(내부)는 어차피 실패하기 때문에 앱이 유효한 JavaScript 객체를 수신할 수 있습니다.내가 그것에 대해 평가나 호출을 하지 않는 한, 난 괜찮을 거야, 안 그래?

내가 뭘 빼놓았나요?

부터JSON.parse()해석할 데이터에서 코드를 실행하지 않습니다.이 방법은 취약하지 않습니다.eval()단, 서버 및 애플리케이션의 무결성을 보호하기 위해 다음과 같은 작업을 수행해야 합니다.

  1. 적절한 위치에 예외 핸들러를 적용합니다.JSON.parse()예외가 발생할 수 있습니다.
  2. 어떤 데이터가 있는지 추측하지 말고 데이터를 사용하기 전에 명시적으로 테스트해야 합니다.
  3. 특별히 찾고 있는 프로세스 속성만 사용하십시오(JSON에 있을 수 있는 다른 정보는 피하십시오).
  4. 모든 착신 데이터가 합법적이고 허용 가능한 값인지 확인합니다.
  5. 데이터 길이를 삭제합니다(과도한 대용량 데이터로 인한 DOS 문제를 방지하기 위해).
  6. 이 착신 데이터를 페이지의 HTML에 직접 삽입하거나 SQL 문에 직접 주입하는 등 추가 평가를 할 수 있는 장소에 두지 마십시오.이는 해당 환경에서 안전한지 확인하기 위해서입니다.

따라서 질문에 "예"라고 직접 대답하려면 먼저 데이터를 처리하기 위한 완벽한 최전방이지만 바디 파서를 사용하는 것 말고도 더 많은 작업을 수행해야 합니다.바디파서에서 데이터를 가져온 후 수행하는 다음 단계는 많은 경우 중요하므로 각별한 주의가 필요할 수 있습니다.


예를 들어, 이러한 검사 중 일부를 적용하는 속성을 가진 개체를 예상하여 예상한 속성만 포함하는 필터링된 결과를 제공하는 구문 분석 함수가 있습니다.

// pass expected list of properties and optional maxLen
// returns obj or null
function safeJSONParse(str, propArray, maxLen) {
    var parsedObj, safeObj = {};
    try {
        if (maxLen && str.length > maxLen) {
            return null;
        } else {
            parsedObj = JSON.parse(str);
            if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) {
                safeObj = parseObj;
            } else {
                // copy only expected properties to the safeObj
                propArray.forEach(function(prop) {
                    if (parsedObj.hasOwnProperty(prop)) {
                        safeObj[prop] = parseObj[prop];
                    }
                });
            }
            return safeObj;
        }
    } catch(e) {
        return null;
    }
}

괜찮을 거예요.의 초기 는 종종 JSON에 전화를 .eval()물론 큰 보안 구멍인 수신 스트링에 접속되어 있습니다. ★★★★★★★★★★★★★★★★★.JSON.parse에서는 이러한 종류의 건전성 체크의 대부분을 처리합니다.

예를 들어 수신된 JSON 개체에서 무언가를 꺼내 SQL 쿼리에 직접 전달하지 않는 한 문제 없습니다.

언급URL : https://stackoverflow.com/questions/25983090/is-sanitizing-json-necessary

반응형