
Bleach 默认会严格过滤 style 属性中的 CSS 声明,但通过显式传入自定义 CSSSanitizer 实例(而非默认的空过滤器),可实现对合法 CSS 的宽松保留,甚至支持白名单式全量放行。
bleach 默认会严格过滤 `style` 属性中的 css 声明,但通过显式传入自定义 `csssanitizer` 实例(而非默认的空过滤器),可实现对合法 css 的宽松保留,甚至支持白名单式全量放行。
在使用 Bleach 进行 HTML 清洗时,style 属性常被完全移除或大幅精简——这是因为 Bleach 内置的 CSS 过滤逻辑默认仅允许极少数安全属性(如 color、font-size 等),且不启用任何 CSS 解析器。若需保留原始 HTML 中丰富的内联样式(例如邮件模板、富文本编辑器导出内容等场景),关键在于显式配置 css_sanitizer 参数。
默认情况下,bleach.clean() 使用 None 作为 css_sanitizer,此时所有 style 值均被丢弃。只需传入一个 bleach.css_sanitizer.CSSSanitizer 实例,即可启用标准 CSS 解析与白名单校验:
import bleach
from bleach.css_sanitizer import CSSSanitizer
ALLOWED_TAGS = ['table', 'tr', 'td', 'p', 'h3', 'b', 'br', 'div', 'h5', 'hr', 'i', 'span', 'strong', 'u']
ALLOWED_ATTRIBUTES = {
"table": ["width", "style"],
"tr": ["style"],
"td": ["width", "style"],
"h3": ["style"],
"p": ["style"]
}
def sanitize_html_body(value):
# ✅ 关键:显式传入 CSSSanitizer 实例
cleaned_value = bleach.clean(
value,
tags=ALLOWED_TAGS,
attributes=ALLOWED_ATTRIBUTES,
strip=True,
css_sanitizer=CSSSanitizer() # 启用 CSS 解析与安全过滤
)
return cleaned_value
CSSSanitizer() 默认采用保守策略:仅允许常见安全属性(如 font-family, color, text-align, margin, padding, border, background 等),并自动剔除危险声明(如 expression(), url(javascript:...), behavior 等)。它还会规范化单位、移除无效语法,确保输出 CSS 既可用又安全。
⚠️ 注意事项:
CSSSanitizer不会无条件放行所有 CSS —— 它始终执行语义级校验,这是 Bleach 安全设计的核心。若需“允许全部”,实际应理解为“在 Bleach 安全模型下尽可能宽泛地接受常用样式”;- 如需进一步放宽限制(例如允许
transform、box-shadow等现代属性),可自定义CSSSanitizer的allowed_css_properties参数:CSSSanitizer(allowed_css_properties=CSSSanitizer.ALLOWED_CSS_PROPERTIES + ["transform", "box-shadow"])- 不建议设置
allowed_css_properties = [](即空列表),这将禁用所有 CSS 属性;也不推荐绕过CSSSanitizer直接正则替换style——会破坏 XSS 防护。
综上,启用 CSSSanitizer 是平衡样式完整性与 Web 安全的正确路径。它让 Bleach 在保留业务所需视觉表现力的同时,坚守 HTML/CSS 输入过滤的安全底线。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











