求助:.NET环境下Markdown处理与HTML Sanitize合规方案选型
针对.NET环境下Markdown处理+安全校验的可行方案
针对你在Markdown处理与HTML sanitize方案选择上的困境,结合.NET现有工具链,我整理了几个既能满足需求、又能规避你提到的各类问题的思路:
方案一:定制Markdig扩展 + HtmlSanitizer(优化维护风险)
你已经给Markdig提交了Yandex.Music的媒体扩展补丁,这个基础可以继续利用:
- 调整你的Markdig扩展,在生成YouTube/Yandex.Music的iframe时,严格限定src的域名范围(比如只允许
youtube.com、youtu.be、music.yandex.ru等官方域名),避免生成任意域名的iframe。 - 使用HtmlSanitizer做后续清洗时,通过它的钩子机制做精细化校验:
- 配置HtmlSanitizer允许
iframe标签,仅保留src、width、height这类必要属性。 - 利用
OnAttributeCreated钩子对src属性做二次校验:解析Uri提取域名,不在白名单内的直接移除整个iframe节点。
- 配置HtmlSanitizer允许
- 关于AngleSharp的维护顾虑:HtmlSanitizer的维护团队一直在跟进AngleSharp的更新,你可以及时升级依赖版本;如果遇到可复现的崩溃问题,直接给HtmlSanitizer或AngleSharp提交issue——你提到愿意贡献上游,这比fork项目成本低得多,也能帮助社区解决同类问题。
方案二:Markdig转换 → 自定义iframe过滤 → HtmlRuleSanitizer兜底
既然HtmlRuleSanitizer不支持iframe域名白名单,我们可以在它的处理流程前后加一层自定义DOM过滤:
- 先用你修改后的Markdig把用户输入转换成HTML字符串。
- 用HtmlAgilityPack(.NET生态中稳定成熟的HTML解析库)解析这个HTML:
- 遍历所有
iframe节点,检查src属性的域名是否在白名单内,不符合的直接从DOM树中移除。 - 确保只保留合法的媒体iframe,过滤掉所有自定义的恶意iframe。
- 遍历所有
- 将处理后的DOM转回字符串,再交给HtmlRuleSanitizer做常规XSS清洗(移除危险标签、属性等)。
这个方案既利用了HtmlRuleSanitizer的全面校验能力,又通过自定义过滤解决了它的iframe白名单短板,而且HtmlAgilityPack的API稳定,维护风险极低。
方案三:Markdig安全模式 + 自定义媒体扩展
Markdig本身提供了SafeMode可以禁用危险的HTML标签和属性,我们可以在此基础上扩展:
- 启用Markdig的安全模式:
var pipeline = new MarkdownPipelineBuilder().UseSafeMode().Build(); - 把你的YouTube/Yandex.Music媒体扩展集成到安全模式的pipeline中,并且在扩展内部硬编码允许的媒体域名,确保生成的iframe只有合法来源。
- 最后可以配合轻量的HTML sanitizer做兜底校验(比如只过滤未被Markdig安全模式覆盖的边缘场景),进一步降低风险。
额外注意事项
- 预处理用户输入:在交给Markdig转换前,先转义用户直接输入的HTML片段(比如
<iframe>、<script>等),避免绕过Markdown解析直接注入恶意代码。 - 域名校验要精准:使用
Uri.TryCreate解析src属性,提取Host进行比对,覆盖所有可能的子域名和短链接形式(比如YouTube的youtu.be)。 - 上游贡献建议:如果时间允许,可以给HtmlRuleSanitizer提交一个「iframe域名白名单」的PR,或者给Markdig的安全模式添加「允许自定义媒体嵌入」的配置项——这不仅能解决你的问题,也能让更多开发者受益。
内容的提问来源于stack exchange,提问作者Leotsarev
相关产品推荐
相关产品推荐

