You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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&gt;;&lt;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&gt;;<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&gt;;&lt;Overflow

string testInput2 = "Stack>;<b>";
string result2 = sanitizer.Sanitize(testInput2);
// 输出:Stack&gt;;<b>

内容的提问来源于stack exchange,提问作者JustLooking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:17:04