You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的bleach库时如何允许所有CSS样式?

问题:如何在Bleach中保留所有HTML元素的CSS样式属性?

运行以下代码后,所有style属性均被移除,请问是否有办法保留所有CSS样式属性?曾尝试使用CSSSanitizer的不同配置,但未找到允许所有样式的实现方式。

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):
    cleaned_value = bleach.clean(value, tags=ALLOWED_TAGS, attributes=ALLOWED_ATTRIBUTES, strip=True)   
    return cleaned_value

html_body = "<table style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;border-collapse:collapse;border-spacing:0;width:100%;color:#000000;margin-bottom:14px\" width=\"100%\">\n            <tr style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif\">\n                <td style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;vertical-align:top;text-align:center;width:60px;background:#ff5400\" width=\"60\">\n                    <b>\n                         \n                    </b>\n                </td>\n                <td style=\"margin:0;border:0;font-family:Arial, Helvetica, sans-serif;vertical-align:top;padding:18px;background:#f6f6f6\">\n                    <h3 style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;font-size:18px;font-weight:bold;margin-bottom:6px\">\n                 test567 \n                    </h3>\n                    <p style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;font-size:12px\">\n                     Tes1234 \n                    </p>\n                </td>\n            </tr>\n        </table>"

print(sanitize_html_body(html_body))

解决方案

问题核心是:默认情况下,即便你在ALLOWED_ATTRIBUTES中允许了style属性,Bleach仍会过滤style内的所有CSS内容。要保留样式,必须显式配置CSSSanitizer并传入bleach.clean()。

要保留所有CSS属性和值,可创建自定义CSSSanitizer实例,设置允许所有属性及对应的值:

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']

# 配置允许所有CSS属性和值的CSSSanitizer
css_sanitizer = CSSSanitizer(
    allowed_properties=["*"],  # 允许所有CSS属性
    allowed_values={"*": ["*"]}  # 允许所有属性的任意值
)

def sanitize_html_body(value):
    cleaned_value = bleach.clean(
        value,
        tags=ALLOWED_TAGS,
        attributes=ALLOWED_ATTRIBUTES,
        css_sanitizer=css_sanitizer,  # 传入自定义CSSSanitizer
        strip=True
    )   
    return cleaned_value

html_body = "<table style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;border-collapse:collapse;border-spacing:0;width:100%;color:#000000;margin-bottom:14px\" width=\"100%\">\n            <tr style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif\">\n                <td style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;vertical-align:top;text-align:center;width:60px;background:#ff5400\" width=\"60\">\n                    <b>\n                         \n                    </b>\n                </td>\n                <td style=\"margin:0;border:0;font-family:Arial, Helvetica, sans-serif;vertical-align:top;padding:18px;background:#f6f6f6\">\n                    <h3 style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;font-size:18px;font-weight:bold;margin-bottom:6px\">\n                 test567 \n                    </h3>\n                    <p style=\"margin:0;padding:0;border:0;font-family:Arial, Helvetica, sans-serif;font-size:12px\">\n                     Tes1234 \n                    </p>\n                </td>\n            </tr>\n        </table>"

print(sanitize_html_body(html_body))

注意事项

允许所有CSS属性和值会引入安全风险,比如攻击者可能注入恶意样式(如固定定位弹窗、隐藏恶意内容等)。如果处理的是不可信用户输入,建议仅允许业务必需的CSS属性,而非全部放开。


内容的提问来源于stack exchange,提问作者Amir Zror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:09:59