如何用Ganss.Xss.HtmlSanitizer检测无效HTML并抛出异常?
实现Ganss.Xss.HtmlSanitizer遇无效HTML抛出异常的方法
要实现输入无效HTML时抛出异常,核心是利用HtmlSanitizer依赖的HtmlAgilityPack的解析错误检测,结合工具的事件或前置解析步骤来实现,具体有两种可行方案:
方案一:提前解析并检查HTML错误
直接用HtmlAgilityPack解析原始HTML,检查解析错误集合,若存在错误则抛出异常,再执行清理操作:
using Ganss.Xss; using HtmlAgilityPack; var html = @"invalid html"; var doc = new HtmlDocument(); // 关闭自动修复嵌套标签,保留原始解析错误 doc.OptionFixNestedTags = false; doc.LoadHtml(html); // 检查解析错误 if (doc.ParseErrors.Any()) { var errorDetails = string.Join("; ", doc.ParseErrors.Select(e => e.Reason)); throw new InvalidOperationException($"无效HTML:{errorDetails}"); } // 解析无错误时执行清理 var sanitizer = new HtmlSanitizer(); var sanitized = sanitizer.Sanitize(html, "https://www.example.com");
方案二:通过Sanitizer事件检查解析文档
利用HtmlSanitizer的PostProcessDocument事件,在清理完成后获取解析后的文档并检查错误:
using Ganss.Xss; var html = @"invalid html"; var sanitizer = new HtmlSanitizer(); bool hasInvalidHtml = false; sanitizer.PostProcessDocument += (s, e) => { // 检查解析文档的错误集合 if (e.Document.ParseErrors.Any()) { hasInvalidHtml = true; } }; var sanitized = sanitizer.Sanitize(html, "https://www.example.com"); if (hasInvalidHtml) { var errorDetails = string.Join("; ", sanitizer.Document.ParseErrors.Select(e => e.Reason)); throw new InvalidOperationException($"无效HTML:{errorDetails}"); }
注意事项
HtmlAgilityPack的ParseErrors会记录解析过程中的语法错误(如未闭合标签、非法结构等),这是判断无效HTML的可靠依据。- 若仅对比原始HTML和清理后的内容,无法区分「合法但被清理的内容」和「无效HTML」,因此优先推荐上述两种方案。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

