.NET Web应用中HtmlSanitizer特殊字符转义错误的解决问询
解决HtmlSanitizer解析URL参数类内容时的实体错误转换问题
问题本质是HtmlSanitizer默认会解析HTML字符实体:¢是HTML标准实体(对应¢符号),£对应£符号,当输入¢erId=2时,工具会优先匹配¢并解析,剩余字符拼接后就变成了¢erId=2,同理£s=10会被解析为£s=10。
针对不同场景,有以下几种解决方案:
方案1:禁用实体解析功能
如果你的业务场景不需要解析任何HTML实体(比如处理URL参数、请求体这类非HTML内容),可以直接关闭HtmlSanitizer的实体解码:
var sanitiser = new HtmlSanitizer { DecodeEntities = false }; var result = sanitiser.Sanitize(rawText);
这样处理后,¢erId=2会完整保留原始内容,不会被错误转换。
方案2:先转义&符号再处理
如果需要保留实体解析能力(比如同时处理部分HTML内容),可以先将输入中的&转义为&,再进行Sanitize操作:
var rawText = "¢erId=2"; // 先转义所有&为HTML实体格式 var escapedText = rawText.Replace("&", "&"); var sanitiser = new HtmlSanitizer(); var result = sanitiser.Sanitize(escapedText);
处理后的结果是&centerId=2,如果是输出到HTML页面中,浏览器会自动将其解析显示为¢erId=2,既避免了XSS风险,也符合预期显示效果。
方案3:改用URL专用编码工具
如果你的处理对象是URL查询参数或请求体这类非HTML内容,HtmlSanitizer并非最佳选择,建议使用.NET内置的URL编码工具:
- 使用
Uri.EscapeDataString对单个参数值编码 - 使用
HttpUtility.UrlEncode处理URL参数
这类工具会按照URL规则对特殊字符编码,从根源上避免HTML实体解析带来的问题。
内容的提问来源于stack exchange,提问作者rahman
相关产品推荐
相关产品推荐

