Python Bleach库怎么用,如何防止XSS攻击?

滚动文字
cleaned = bleach.clean(unsafe_html, tags=allowed_tags)

结果:

第2课 XSS之存储型XSS攻击
加载中
第2课 XSS之存储型XSS攻击

欢迎访问 官网

<marquee>滚动文字</marquee>

### 精细化控制属性白名单仅限制标签是不够的,属性同样是 XSS 的高发区,Bleach 允许通过 `attributes` 参数为每个标签单独配置允许的属性。- 简单列表形式:所有允许标签共享同一组属性。- 字典形式:为不同标签定义不同的属性集(推荐)。```pythonimport bleach# 为不同标签配置不同属性allowed_attrs = {    'a': ['href', 'title', 'rel'],    'img': ['src', 'alt', 'width', 'height'],}unsafe_html = '<a href="http://safe.com" onclick="steal()">链接</a><img src="pic.jpg" onload="hack()">'cleaned = bleach.clean(unsafe_html, tags=['a', 'img'], attributes=allowed_attrs)# 结果:<a href="http://safe.com">链接</a><img src="pic.jpg">

协议过滤与链接转换

Bleach 还能过滤 hrefsrc 中的协议,防止 javascript:alert(1) 这种伪协议攻击。

  • 协议白名单:通过 protocols 参数指定,默认允许 http, https, mailto
  • 自动链接化:使用 bleach.linkify() 将文本中的 URL 自动转换为 <a>
import bleach
text = "请访问 https://google.com 查看详情"
linked_text = bleach.linkify(text)
# 结果:请访问 <a href="https://google.com" rel="nofollow">https://google.com</a> 查看详情

bleach python 与 html.escape 区别

很多开发者在初学时会混淆 bleach.clean()

Python Bleach库怎么用,如何防止XSS攻击?

和 Python 标准库中的 html.escape(),虽然两者都涉及 HTML 处理,但其设计目标和应用场景截然不同。

核心差异对比

维度 html.escape bleach.clean
处理逻辑 全量转义(Escaping) 选择性清洗(Sanitizing)
结果形式 < 变为 &lt;,所有 HTML 失效 保留安全标签,剔除/转义危险部分
适用场景 显示用户原样输入的文本 渲染经过审核的富文本/HTML 内容
性能开销 极低(简单的字符串替换) 较高(需要解析 DOM 树)
安全性 绝对安全(因为不渲染任何 HTML) 高度安全(基于白名单过滤)

场景选择指南

  • 场景 A:用户评论区,如果要求用户只能输入纯文本,请直接使用 html.escape(),这样无论用户输入什么,页面都会将其视为文字显示,不会被浏览器执行。
  • 场景 B:博客编辑器/CMS 系统,如果允许用户使用加粗、斜体、插入图片,则必须使用

    Python Bleach库怎么用,如何防止XSS攻击?

    bleach.clean(),它能在保证页面布局不被破坏的前提下,剔除恶意脚本。

行业共识认为,安全防御应采取分层策略,在存储阶段可以使用 Bleach 进行初步清洗,在渲染阶段根据上下文选择合适的转义方法,构建深度防御体系。

Django 项目中使用 bleach 库的性能

在高性能的 Web 应用中,尤其是使用 Django 或 Flask 等框架时,频繁调用 Bleach 的解析过程可能会成为性能瓶颈,因为 Bleach 依赖的 html5lib 在解析大型 HTML 文档时速度相对较慢。

性能优化策略

为了在保证安全的同时不牺牲响应速度,可以采取以下优化方案:

  • 清洗时机前移:不要在每次页面渲染(Template 渲染)时调用 bleach.clean(),应该在数据写入数据库之前(如在 Django Model 的 save() 方法或 Form 的 clean() 方法中)进行一次性清洗。
  • 结果缓存:对于不经常变动的富文本内容,将清洗后的 HTML 结果缓存到 Redis 中,避免重复解析。
  • 限制输入长度:在调用 Bleach 之前,先对输入字符串进行长度截断,处理 10KB 的 HTML 和处理 1MB 的 HTML 在性能上有着量级差别。

实际集成路径

在 Django 中,最优雅的集成方式是自定义模板过滤器(Template Filter):

  1. 在 app 目录下创建 templatetags 文件夹。
  2. 编写过滤器代码:
from django import template
import bleach
register = template.Library()
@register.filter(name='safe_html')
def safe_html(value):
    # 定义业务所需的白名单
    allowed_tags = ['b', 'i', 'u', 'p', 'br']
    return bleach.clean(value, tags=allowed_tags)

Python Bleach库怎么用,如何防止XSS攻击?

  1. 在模板中使用:{{ content|safe_html|safe }},注意,|safe 是 Django 的内置过滤器,告诉模板引擎不要再次转义 Bleach 已经清洗过的安全标签。

Bleach 为 Python 开发者提供了一种结构化、可配置的 HTML 清洗方案,通过白名单机制有效解决了 XSS 攻击这一核心痛点,在实际应用中,应根据业务需求精准配置标签和属性白名单,并结合 html.escape 实现分层防御,同时通过前置清洗和缓存来抵消解析性能的损耗。

Bleach Python 相关常见问题 Q&A

Bleach 库目前是否还在维护?

Bleach 依然是 Python 社区处理 HTML 清洗的主流选择,虽然更新频率有所降低,但其基于 html5lib 的解析逻辑依然稳健,对于绝大多数 Web 应用的 XSS 防御需求,它提供的功能已经足够且成熟。

Bleach 能处理 SVG 标签中的恶意代码吗?

SVG 标签非常复杂,内部可以包含 <script>onload 事件,如果将 svg 加入白名单,必须极其谨慎地配置其允许的属性,据统计,许多 XSS 漏洞正是通过允许 SVG 标签但未严格限制属性而产生的,建议除非必要,否则不要在白名单中开启 svg

如果我想完全删除非法标签而不是转义它们该怎么做?

在调用 bleach.clean() 时,可以通过设置 strip=True 参数来实现,默认情况下,Bleach 会将非法标签转义为 &lt;tag&gt; 形式显示在页面上;设置 strip=True 后,非法标签及其内容将被直接从字符串中删除。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/488172.html

(0)
怎么用Excel快速对账,两个表格如何自动核对?
上一篇 2026年7月12日 18:34
快云科技618VPS有什么优惠,香港CN2服务器哪家好?
下一篇 2026年7月12日 18:37

相关推荐

  • 莞式一共有哪些服务器

    莞式服务器主要分为自建机房、服务器托管和云服务器三类,其中以简米科技和酷番云为代表的持牌服务商凭借完善资质成为市场主力, 莞式服务器并非特指单一品牌,而是东莞地区数据中心提供的服务器产品统称,涵盖物理机、云主机等多种形态,选择时需优先考察服务商资质,确保合规与稳定,莞式服务器的定义与核心分类莞式服务器指东莞地区……

    2026年8月24日
    300
  • 服务器提示负载过高怎么办?服务器负载过高如何快速排查解决

    服务器提示负载过高,本质是系统资源供需失衡的紧急信号,通常意味着CPU、内存、磁盘I/O或网络带宽等核心硬件资源已接近耗尽,或者系统配置无法承载当前的并发访问量,解决这一问题的核心思路,必须遵循“即时止损、排查定位、优化根治”的三步走策略,切勿在未查明病因前盲目重启服务器,以免破坏现场数据或导致数据库损坏, 紧……

    2026年3月11日
    11400
  • 规则引擎如何解析数据?规则引擎解析数据的原理

    规则引擎解析数据的核心在于将非结构化或半结构化的业务数据,通过预设的逻辑规则进行自动化清洗、转换和路由,从而实现业务逻辑与代码的解耦,让不懂编程的业务人员也能直接配置数据处理流程,为什么传统代码处理数据越来越吃力硬编码带来的维护噩梦在早期的系统架构中,数据清洗和规则判断往往直接写死在Java、Python或C……

    2026年7月5日
    13500
  • 服务器带宽收费标准是怎样的,服务器带宽价格一般多少钱

    服务器带宽收费标准的制定主要取决于带宽类型(独享或共享)、线路质量(电信、联通、移动、BGP)、计费模式(固定带宽或按流量)以及服务器部署地域,企业若想实现成本最优,必须根据业务流量波峰波谷特性选择匹配的计费方案,并优先考虑具备智能调度能力的BGP线路以提升用户体验, 核心计费模式深度解析服务器带宽的收费并非单……

    2026年4月3日
    9900
  • 服务器选择要考虑哪些方面,怎么选性价比高?

    服务器选择的核心在于匹配业务需求,而非盲目追求高配置,明确网站类型、流量预期和预算,才能找到性价比最高的方案,服务器怎么选?先搞清楚这些核心因素业务类型和流量预期不同业务对服务器要求差异很大,个人博客或展示网站:流量小,资源需求低,共享主机或低配VPS足够,企业官网和电商平台:需要稳定性和并发处理能力,推荐云服……

    2026年7月24日
    600
  • 高级云渲染是什么?云渲染软件哪个好用

    高级云渲染已成为2026年数字内容工业的底层算力中枢,彻底终结本地硬件性能瓶颈,实现跨端极致视觉体验与降本增效的必然选择,算力跃迁:高级云渲染的底层重构突破物理边界的分布式架构传统单机渲染受限于CPU/GPU的物理堆叠,而高级云渲染通过分布式算力网络,将巨型计算任务拆解至云端集群,根据【中国信通院】2026年……

    2026年4月28日
    4300
  • 分块表单配置怎么做,有哪些实用技巧和注意事项?

    分块表单配置的核心在于将复杂表单拆解为独立模块,通过步骤引导或区块分组提升用户完成率,数据收集质量也显著提高,分块表单配置教程:从理解到实施分块表单配置并不是简单地把长表单砍成几段,而是基于用户行为逻辑和业务需求重新组织信息,许多人误以为分块只是视觉上的分割,但真正有效的配置隐藏在产品设计、前端交互和后端数据处……

    2026年8月7日
    800
  • 个人用电信云主机做什么好?电信云主机搭建网站优势

    个人用电信云主机主要适合搭建高稳定性要求的个人博客、小型企业官网、私有云存储以及轻量级开发测试环境,其核心优势在于国内访问速度极快且无需备案(针对特定跨境业务)或备案流程规范,是追求极致访问体验用户的优选,在2026年的数字生态中,个人开发者、自由职业者以及小微创业者对服务器基础设施的需求已从单纯的“能用”转向……

    2026年5月27日
    4600
  • 个人电脑监控外发文档真的能防泄密吗?如何设置电脑监控外发文档

    个人电脑监控外发文档的核心在于通过终端安全软件或DLP(数据防泄漏)系统,对敏感文件的复制、打印、邮件发送及即时通讯传输进行实时审计与阻断,从而防止企业核心数据非法流出,在数字化转型的深水区,数据资产已成为企业的核心命脉,许多管理者发现,传统的防火墙只能挡住外部的攻击,却防不住内部员工的无心之失或恶意窃取,当一……

    服务器运维 2026年5月27日
    4700
  • 服务器十大品牌都有哪些,哪个牌子性价比高?

    戴尔、浪潮、HPE、联想、华为、超微、新华三、IBM、思科、富士通,其中戴尔和浪潮在出货量与市场份额上长期占据前两位,选购服务器时,品牌只是第一道门槛,真正影响后续业务稳定性的,是硬件背后的部署环境、运维响应和合规资质,本文结合近三年的行业公开数据和企业采购实践,理清这十个品牌的真实差异,并顺带说清楚在采购时那……

    2026年8月20日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注