背景与价值XXE通过外部实体注入读取文件或发起网络请求。禁用相关特性与过滤输入可有效防护。统一规范禁用DOCTYPE:拒绝包含 `<!DOCTYPE` 的输入。禁用外部实体:解析器配置关闭外部实体解析。输入过滤:长度与字符集限制,拒绝可疑引用。核心实现输入过滤与拒绝function containsDoctype(xml: string): boolean { return /<!DOCTYPE/i.test(xml) } function containsExternalEntity(xml: string): boolean { return /SYSTEM\s+"|PUBLIC\s+"/i.test(xml) } function safeXml(xml: string): boolean { if (typeof xml !== 'string' || xml.length > 1_000_000) return false if (containsDoctype(xml)) return false if (containsExternalEntity(xml)) return false return true } 解析器占位(禁用外部实体)type ParserOpt = { disableExternalEntity: boolean } function parseXml(xml: string, opt: ParserOpt): Document | null { if (!safeXml(xml)) return null if (!opt.disableExternalEntity) return null return new DOMParser().parseFromString(xml, 'application/xml') } 落地建议在解析层统一禁用外部实体解析并拒绝包含DOCTYPE的输入。设置输入长度与字符集限制,审计异常与拒绝事件。验证清单输入是否通过过滤;解析器是否禁用外部实体并拒绝危险构造。

发表评论 取消回复