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 还能过滤 href 或 src 中的协议,防止 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://test.idctop.com/article/488172.html

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

相关推荐

  • 服务器小号密码忘了怎么办?找回服务器小号密码的正确方法

    专业、安全、可落地当服务器小号密码忘了,第一时间别慌——90%的账号恢复问题可在30分钟内通过标准流程解决,核心原则是:优先启用备用凭证,其次走官方重置路径,最后才考虑技术干预,以下为经过企业级运维实践验证的分步指南,适用于Linux/Windows服务器、云平台(阿里云/腾讯云/AWS)及自建SSH密钥体系下……

    2026年4月14日
    9200
  • Linux下有哪些常见的网页服务器,哪个性能最好?

    Linux下的Web服务器,当前主流选择是Nginx与Apache,Java后端用Tomcat,追求自动HTTPS选Caddy,虚拟主机业务则常搭配OpenLiteSpeed, 据W3Techs近年来的统计,Nginx在全部活跃网站中的市场份额长期保持领先,Apache紧随其后,两者构成了Web服务的基础盘,N……

    2026年8月20日
    500
  • Python CherryPy怎么用?CherryPy框架入门教程

    Python Cherrypy 是一个轻量级、零配置且极速的 WSGI 框架,特别适合构建中小型 Web 应用、API 服务或作为微服务架构中的轻量级组件,其核心优势在于代码即配置的高效开发体验,在 Python 生态中,框架选择往往是一场关于“控制欲”与“开发效率”的博弈,Django 像是一座设施齐全的自助……

    2026年7月9日
    10400
  • 熹妃传9一共有哪些服务器?,哪个服务器好?

    熹妃传9的服务器总体分为官方服务器和渠道服务器两大类,截至2026年,游戏已开放超过200组区服,覆盖iOS、安卓及双平台,玩家可根据自身设备与偏好选择进入,服务器分类与分布官方服务器官方服务器由游戏发行商直接运营,是玩家最直接的选择,这类服务器通常分为三种子类型:iOS服:仅限苹果设备玩家,数据完全独立,活动……

    2026年8月23日
    100
  • 服务器怎么复制文件夹?远程桌面复制文件方法

    在服务器运维与文件管理场景中,复制文件夹并非简单的“复制粘贴”操作,其核心在于根据数据量大小、跨网环境及系统类型,选择最高效且数据一致性的传输工具,对于运维人员而言,掌握命令行工具与同步算法,远比依赖图形界面更为关键,核心结论:小文件用CP,大文件或增量用RSYNC,跨网用SCP或打包传输,这一结论基于服务器文……

    2026年3月20日
    11500
  • 服务器搬迁总结怎么做?服务器搬迁注意事项有哪些

    本次服务器搬迁项目已圆满结束,实现了业务零中断、数据零丢失的核心目标,整体性能提升约40%,为后续业务扩展奠定了坚实基础,通过对全流程的深度复盘,我们验证了精细化预案与自动化工具在复杂迁移场景中的决定性作用,这不仅是一次物理位置的转移,更是IT基础设施架构的一次全面优化升级,以下是对本次服务器搬迁总结的详细复盘……

    2026年3月11日
    13800
  • 如何用Python操作SugarCRM?SugarCRM Python接口调用方法

    在 Python 中操作 SugarCRM(现称为 SuiteCRM 或 Sugar Suite)通常有几种主要方式,具体取决于你使用的 SugarCRM 版本(Cloud vs On-Premise)以及 API 版本(REST v10 是主流),以下是几种常见的方法:使用官方/社区推荐的 Python 库……

    2026年7月12日
    19500
  • 服务器找不到磁盘阵列怎么办?服务器磁盘阵列故障解决方法

    服务器启动后,在操作系统或RAID管理工具中无法识别到预期的磁盘阵列(RAID Group),这是一个严重影响业务运行的紧急故障,核心原因通常集中在物理连接问题、驱动程序/固件异常、RAID控制器配置丢失或初始化失败、以及操作系统层面的识别障碍几个关键环节,解决此问题需要系统性地排查硬件、固件、驱动和配置, 物……

    2026年2月7日
    13330
  • 个人域名不备案能直接用吗?国内域名备案新规

    个人域名不备案无法在中国大陆境内服务器上搭建可公开访问的网站,这是受国家法律法规严格约束的硬性规定,不存在合规的绕过手段,很多刚接触建站的朋友,手里拿着一个心仪的域名,却对“备案”这两个字感到头疼,他们往往觉得流程繁琐、耗时漫长,甚至产生一种“如果不备案是不是就能省掉这些麻烦”的侥幸心理,这种想法在早期互联网野……

    服务器运维 2026年6月12日
    5310
  • 服务器对游戏有什么用?游戏服务器的作用和重要性

    服务器是支撑现代游戏运行的底层基础设施,没有服务器,绝大多数在线游戏根本无法运行,它不仅负责数据存储与逻辑计算,更直接影响玩家的游戏体验——延迟、掉线、匹配效率、反作弊能力等核心指标,均由服务器性能与架构决定,本文从技术与用户体验双维度出发,系统解析服务器对游戏的实际作用,核心功能:服务器是游戏运行的“大脑+心……

    2026年4月13日
    6700

发表回复

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