目錄 / Table of Contents

載入與串流讀取安全限制

內容語系:正體中文(臺灣)(zh-TW)。

核心封裝載入與 OdsStreamReaderOdtStreamReader 都會處理不可信 ZIP/XML 輸入。 串流 Reader 不建立完整文件 DOM,但仍會配置目前資料列、 節點文字、ZIP 解壓及 XML Reader 所需的緩衝。低常駐設計不等於不受輸入大小影響。

核心封裝限制

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 驗證路徑(OdfPackageValidatorOdfFlatDocumentValidator、profile 規則掃描)同樣套用 MaxXmlCharactersInDocument:封裝路徑使用 package.LoadOptions,Flat 路徑使用 OdfValidationOptions.LoadOptions(未指定時採 OdfLoadOptions 預設 64 MiB)。簽章、 時間戳記、憑證撤銷資料與外部網路回應另有各自的較小界限,不能以核心封裝上限取代。

這些限制是載入階段的資源防線,不等於文件內容安全政策。巨集、外部資源、簽章、加密與 profile 規則應另以 OdfPackageValidatorSanitizeMacros、簽章驗證 API 或 pwsh eng/Test-OdfPolicy.ps1 處理。

串流 Reader 限制

Reader 限制 預設值
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 後繼續回傳看似完整的資料。應將這類失敗視為 資源保護結果,不應自動改用無上限設定重試。

資料流所有權

options 的 LeaveOpen 預設為 false。設為 true 時,處置 Reader 仍會關閉其 XML entry 串流及 ZIP Reader,但保留呼叫端提供的最外層資料流。

信任邊界

不可信文件應保留預設限制,並先執行 package/schema 驗證。可信且確實需要處理大型文件 時,可以提高個別限制;提高 XML 或文字上限也會同步提高記憶體與 CPU DoS 風險。 MaxXmlCharactersInDocument = 0 只會停用 XML 字元限制,其餘 Reader 限制仍然有效。 ODS/ODT Reader options 在設定屬性時即驗證相同規則:XML 字元限制允許 0、拒絕負值; 資料列、資料行、repeat、節點與單一文字上限都必須大於 0,不會延後到開始讀取後才失敗。

安全限制、驗證及 sanitize 是降低風險的措施,不構成對惡意文件絕對安全的保證。