
Bleach 默认会严格过滤 style 属性中的 CSS 声明,但通过传入自定义 CSSSanitizer 实例并配置其白名单策略,可实现对全部合法 CSS 属性的宽松保留。
bleach 默认会严格过滤 `style` 属性中的 css 声明,但通过传入自定义 `csssanitizer` 实例并配置其白名单策略,可实现对全部合法 css 属性的宽松保留。
Bleach 是 Python 中广泛使用的 HTML 清洗库,其核心设计强调安全性,默认会对 <style></style> 标签内容及 style 属性值进行深度解析与限制——仅保留预设白名单内的 CSS 属性(如 color、font-size 等),其余一律剔除。这导致你在示例中看到所有 margin、padding、border 等常用样式被移除。
要允许全部标准 CSS 属性(即“放行所有合法声明”),关键在于显式传入一个 CSSSanitizer 实例,并确保它不启用严格模式。bleach.clean() 的 css_sanitizer 参数正是为此设计:
import bleach
from bleach.css_sanitizer import CSSSanitizer
ALLOWED_ATTRIBUTES = {
"table": ["width", "style"],
"tr": ["style"],
"td": ["width", "style"],
"h3": ["style"],
"p": ["style"]
}
ALLOWED_TAGS = [
"table", "tr", "td", "p", "h3", "b", "br", "div",
"h5", "hr", "i", "span", "strong", "u"
]
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()默认不会放行所有 CSS 属性——它仍基于bleach.css_sanitizer.ALLOWED_CSS_PROPERTIES白名单(约 120+ 常用属性)。若需真正“允许全部”,需自定义白名单:from bleach.css_sanitizer import CSSSanitizer import cssutils # 获取所有已知 CSS 属性(需 cssutils 支持) all_css_props = set(cssutils.css.CSSStyleDeclaration._properties.keys()) # 或更安全的做法:扩展默认白名单 extended_props = set(CSSSanitizer().allowed_css_properties) | { "margin", "padding", "border", "box-sizing", "text-align", "vertical-align" } css_sanitizer = CSSSanitizer(allowed_css_properties=extended_props)
此外,还需注意:
立即学习“前端免费学习笔记(深入)”;
-
CSSSanitizer仅处理style属性和<style></style>标签内容,不影响内联事件(如onclick)或<script></script>——这些仍由bleach.clean()的主逻辑拦截; -
strip=True会移除非法标签及其内容,但不会影响style属性清洗逻辑; - 若使用旧版
bleach ,<code>CSSSanitizer尚未内置,需升级或手动实现简易解析器。
总结:Bleach 并非“禁止 style”,而是默认保守;只需显式注入 CSSSanitizer() 实例,即可激活 CSS 声明级控制能力。进一步定制白名单,即可在安全与兼容性之间取得精准平衡。


















