.NET HTML Sanitizer配置问题:阻止误删内容与强制补全标签
解决方案
问题1:将误判的类标签内容转义而非删除
默认情况下,HtmlSanitizer会把<开头的未知标签直接移除。要实现仅删除危险标签、将非危险的类标签内容转义为HTML实体,需配置InvalidTagHandler委托,把未知标签转换为转义后的实体:
var sanitizer = new HtmlSanitizer(); // 处理未知标签:将其转义为HTML实体,而非删除 sanitizer.InvalidTagHandler = (tagName, originalHtml, node) => { return System.Net.WebUtility.HtmlEncode(originalHtml); };
配置后输入Stack>;<Overflow,输出为Stack>;<Overflow,符合预期。(若使用.NET Framework,替换为System.Web.HttpUtility.HtmlEncode)
问题2:禁止自动补全HTML闭合标签
HtmlSanitizer依赖的HTML解析器默认会自动补全未闭合标签。要保留用户原输入的未闭合标签,需自定义HTML解析器配置,关闭自动补全行为:
var sanitizer = new HtmlSanitizer(); // 自定义解析器,关闭自动补全标签功能 sanitizer.HtmlParserFactory = () => { var parser = new HtmlParser(); parser.Options.AutoCloseTags = false; parser.Options.WriteEmptyNodes = false; return parser; };
配置后输入Stack>;<b>,输出会保留<b>而不会自动补全</b>,结果为Stack>;<b>。
完整配置示例
将两个配置结合,完整代码如下:
using Ganss.Xss; using HtmlAgilityPack; var sanitizer = new HtmlSanitizer(); // 转义未知标签而非删除 sanitizer.InvalidTagHandler = (tagName, originalHtml, node) => { return System.Net.WebUtility.HtmlEncode(originalHtml); }; // 关闭自动补全标签 sanitizer.HtmlParserFactory = () => { var parser = new HtmlParser(); parser.Options.AutoCloseTags = false; parser.Options.WriteEmptyNodes = false; return parser; }; // 测试验证 string testInput1 = "Stack>;<Overflow"; string result1 = sanitizer.Sanitize(testInput1); // 输出:Stack>;<Overflow string testInput2 = "Stack>;<b>"; string result2 = sanitizer.Sanitize(testInput2); // 输出:Stack>;<b>
内容的提问来源于stack exchange,提问作者JustLooking
相关产品推荐
相关产品推荐

