如何验证Markdown代码以防范XSS攻击?支持用户提交Markdown的博客安全方案咨询
支持用户提交Markdown的博客站点XSS防范策略
输入层处理
- 限制用户可用的Markdown语法范围,仅开放排版必需的基础语法,禁用内嵌HTML、内联事件等扩展能力。如果确实需要支持部分HTML标签,提前维护严格的标签&属性白名单,禁止
<script>、<iframe>、<form>等危险标签,以及所有on*开头的事件属性、style属性(避免表达式注入)。 - 入库前仅存储原始Markdown文本,不要提前预解析为HTML存入数据库,避免恶意内容持久化后被直接取出渲染。
- 对用户提交的内容做格式校验,不符合语法规范的内容直接拦截,不允许进入存储流程。
输出层处理
- 渲染前必须对Markdown解析生成的HTML做消毒处理,优先使用业内成熟的消毒库(比如前端
DOMPurify、Python服务端bleach、Node.js服务端jsxss),不要手动实现消毒逻辑,避免规则遗漏产生漏洞。 - 对所有非白名单的HTML特殊字符统一做实体转义,将
<、>、"、'、&等字符替换为对应字符实体,避免被浏览器解析为可执行代码。 - 针对用户提交的链接、图片地址做协议校验,仅允许
http、https等安全协议,拦截javascript:、vbscript:、data:等可执行脚本协议,同时所有用户提交的外链自动添加rel="noopener noreferrer"属性。
兜底安全配置
- 服务端配置
Content-Security-Policy(CSP)响应头,禁止页面执行内联脚本、禁止加载未授权域名的资源,即便恶意内容绕过了前面的过滤规则,CSP也能阻止脚本实际执行。 - 额外配置
X-XSS-Protection: 1; mode=block、X-Content-Type-Options: nosniff安全头,降低浏览器主动解析恶意内容的风险。 - 给站点身份凭证Cookie设置
HttpOnly、Secure、SameSite属性,即便出现XSS漏洞,攻击者也无法窃取到用户的身份凭证。 - 如果支持用户上传图片等资源,统一存储到独立的静态资源域名,和主站域名做隔离,避免资源携带的恶意代码污染主站环境。
内容的提问来源于stack exchange,提问作者cozycoder
相关产品推荐
相关产品推荐

