目錄 / Table of Contents

로드 및 스트리밍 리더 보안 제한

참고용 번역입니다. 내용이 다를 경우 zh-TW 원본이 우선합니다.

패키지 로드와 OdsStreamReader/OdtStreamReader는 신뢰할 수 없는 ZIP/XML 입력을 처리합니다. Reader는 전체 문서 DOM을 만들지 않지만 현재 행, 노드 텍스트, ZIP 압축 해제 및 XML 리더를 위한 버퍼를 할당합니다. 낮은 상주 메모리 설계도 입력 크기의 영향을 없애지는 않습니다.

핵심 패키지 제한

OdfDocument.Load, 형식별 Load facade 및 OdfPackage.Open은 OdfLoadOptions 리소스 예산을 공유합니다.

제한 기본값 보호 목적
ZIP 엔트리 수 5,000 많은 작은 엔트리로 인한 CPU 및 메모리 고갈 방지
단일 엔트리 압축 해제 크기 500 MiB ZIP 엔트리 하나의 확장량 제한
전체 압축 해제 크기 1 GiB 모든 엔트리의 총 확장량 제한
검색 불가능한 원시 입력 크기 1 GiB ZIP 확장 전 버퍼링 제한
단일 XML 문서 문자 수 64 MiB XML 구문 분석 및 DOM 생성 비용 제한

네 ZIP 제한은 양수여야 하며 0 또는 음수는 즉시 ArgumentOutOfRangeException을 발생시킵니다. MaxXmlCharactersInDocument = 0만 XML 제한을 비활성화합니다. 모든 XML Reader는 외부 DTD와 resolver를 금지해야 합니다. 새 경로는 OdfLoadOptions를 재사용해야 합니다. 패키지와 Flat XML 검증 경로(OdfPackageValidator, OdfFlatDocumentValidator, profile 규칙 검사)에도 MaxXmlCharactersInDocument가 적용됩니다. 패키지 검증은 package.LoadOptions를 사용하고 Flat 검증은 OdfValidationOptions.LoadOptions를 사용하며, 생략하면 OdfLoadOptions의 기본값인 64 MiB가 적용됩니다. 서명, 타임스탬프, 인증서 해지 데이터 및 외부 네트워크 응답에는 각각 더 작은 별도 제한이 있으며 코어 패키지 제한으로 대체할 수 없습니다. 콘텐츠 정책에는 OdfPackageValidator, SanitizeMacros, 서명 검증 또는 pwsh eng/Test-OdfPolicy.ps1을 사용하십시오.

기타 리소스 및 출력 보호

패키지 및 스트리밍 리더 제한 외에도 다음 고정 제한이 신뢰할 수 없는 입력으로부터 보호합니다. 이 값들은 현재 코드 내 고정 상수이며 OdfLoadOptions나 옵션 개체로는 아직 설정할 수 없습니다. 제한을 높이거나 제거하기 전에 메모리와 스택에 미치는 영향을 평가하십시오.

항목 제한 초과 시 동작
ZIP 항목의 실제 압축 해제 크기 헤더에 선언된 비압축 크기를 초과할 수 없음(파일 경로 로드의 MMF 경로) SecurityException
손상된 ZIP 중앙 디렉터리 또는 ZIP64 MMF 고속 경로는 ZIP64를 지원하지 않으며, 완전히 구문 분석할 수 없는 레코드를 조용히 건너뛰어서는 안 됨 ZipArchive 검증 및 읽기로 대체
XML 요소 중첩 깊이 256단계(OdfXmlReader.MaxElementDepth). DOM 로드, Flat ODF 로드, 프로필 규칙 검증, RDF 구문 분석에 적용 로드는 SecurityException을 던지고, 검증은 ODF0303 또는 ODF0301을 보고
수식 구문 분석 중첩 깊이 괄호, 함수 인수, 인라인 배열, 연속된 접두 연산자 각각 256단계 InvalidOperationException
수식 연산자 노드 총수 4,096(FormulaParser.MaxOperatorNodes). 이항, 단항, 백분율, 참조 연산자의 합계. 연쇄 수식은 왼쪽으로 깊은 트리가 되어 평가와 직렬화가 단계마다 재귀하므로, 이 제한으로 일반 스레드 스택이 충분하도록 보장 InvalidOperationException
수식 재귀의 스택 여유 구문 분석, 평가, 범위 가져오기, 직렬화는 각 재귀 단계에 들어가기 전에 남은 스택(RuntimeHelpers.EnsureSufficientExecutionStack)을 확인합니다. 128–256 KB의 작은 스택 스레드에서도 한계에 가까운 수식이 프로세스를 중단시키지 않음 InsufficientExecutionStackException. EvaluateFormulas는 이를 수식 평가 예외 또는 #VALUE!로 변환
수식 문자열 결과 길이 1,048,576자(&, 함수 결과, SUBSTITUTE, REPT) #VALUE! 반환
인수가 반복 상한이 되는 수식 함수 BINOMDIST 누적 100,000, CRITBINOM·HYPGEOMDIST 누적 100,000, POISSON 누적 1,000,000, DB·DDB·VDB·CUMIPMT 기간 1,000,000 #NUM! 반환
스프레드시트 행/열 인덱스 행 1,048,575, 열 16,383(OdfSpreadsheetLimits) ArgumentOutOfRangeException
문서 추가 문서를 자기 자신에 추가할 수 없음 ArgumentException
Collaboration addColumns OdtOperationSafetyOptions의 열 수와 전체 셀 수 제한을 받음 안전 한도를 기록하고 해당 작업을 건너뜀
차트 대체 이미지 한 변 4,096 px 한도로 제한
LibreOffice 변환 형식 콜론 앞의 확장명 부분은 비어 있을 수 없으며 .., NUL, CR, LF를 포함할 수 없음 ArgumentException
SPARQL 쿼리 SERVICE 절은 허용되지 않음(쿼리 엔진이 임의의 엔드포인트로 네트워크 요청을 보내는 것을 방지) ArgumentException

스트리밍 리더 제한

리더 제한 기본값
ODS XML 문자 64 MiB
ODS 워크시트당 행 1,048,576
ODS 행당 열 16,384
ODS 단일 repeat 선언 행 1,048,576; 열 16,384
ODS 단일 셀의 추출 텍스트 16 MiB
ODT XML 문자 64 MiB
ODT 반환되는 텍스트 노드 1,000,000
ODT 단일 노드의 추출 텍스트 16 MiB

제한을 초과하면 읽기가 실패하며 repeat를 잘라 완전해 보이는 데이터를 반환하지 않습니다. 무제한 설정으로 자동 재시도하지 마십시오. LeaveOpen의 기본값은 false입니다. true이면 XML 엔트리 스트림과 ZIP 리더는 닫지만 호출자가 제공한 가장 바깥쪽 스트림은 열어 둡니다.

신뢰할 수 없는 문서에는 기본 제한을 유지하고 먼저 패키지와 스키마를 검증하십시오. XML 또는 텍스트 제한을 높이면 메모리와 CPU DoS 위험도 커집니다. MaxXmlCharactersInDocument = 0은 XML 문자 제한만 끕니다. 제한, 검증 및 정제는 위험을 줄이지만 악성 문서에 대한 절대 안전을 보장하지 않습니다.

ODS/ODT Reader options는 속성 설정 시 규칙을 검증합니다. XML 제한은 0을 허용하지만 행, 열, repeat, 노드 및 텍스트 제한은 0보다 커야 합니다.