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://idctop.com/python-bleach%e5%ba%93%e6%80%8e%e4%b9%88%e7%94%a8%ef%bc%8c%e5%a6%82%e4%bd%95%e9%98%b2%e6%ad%a2xss%e6%94%bb%e5%87%bb%ef%bc%9f/

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

相关推荐

  • 高维数据矩阵可视化怎么做?高维数据可视化工具推荐

    高维数据矩阵可视化的核心在于利用降维算法与交互映射,将多维特征空间转化为人类视觉可感知的低维坐标,从而精准挖掘数据簇群与异常边界,高维数据矩阵可视化的底层逻辑与行业痛点维度灾难下的认知瓶颈当特征维度突破三维时,传统散点图彻底失效,在【生物信息学】领域,单细胞RNA测序数据动辄涵盖2万+基因表达维度,若缺乏高效映……

    2026年4月24日
    6700
  • s3服务器有哪些牌子

    选择S3服务器,主流牌子包括AWS S3、阿里云OSS、腾讯云COS、华为云OBS,以及开源方案MinIO,国内IDC服务商如简米科技和酷番云也提供兼容S3协议的存储服务,主流公有云S3服务品牌公有云厂商提供的对象存储服务大多兼容S3 API,是多数用户接触S3服务器的起点,这些品牌的核心优势在于开箱即用、按量……

    2026年8月20日
    1300
  • LR压测监控服务器要看哪些指标呢?,压测指标怎么看

    LR压测监控服务器,核心看CPU、内存、磁盘I/O、网络吞吐、系统负载和关键进程状态,这六个维度直接决定压测结果的有效性和系统瓶颈定位,压测不是简单施压,而是通过指标反推系统短板,以下从指标拆解到实操工具,再到瓶颈识别,给出完整监控框架,拆解核心监控指标:六维全景图CPU使用率与运行队列CPU是服务器的运算大脑……

    2026年8月6日
    100
  • 非人学院到底有哪些服务器,非人学院哪个服务器人多?

    非人学院的服务器并不复杂,主要分为官方服务器和渠道服务器两大类,其中官方服务器支持iOS与安卓互通,渠道服则各自独立,非人学院官服和渠道服有什么区别?很多玩家第一次登录非人学院时,会被登录界面上的服务器列表绕晕,其实列表里的服务器身份只有两种:官方服和渠道服,官方服指从非人学院官方网站或App Store下载的……

    2026年9月23日
    000
  • 炒cc域名真能赚钱吗,新手入手cc域名风险大吗?

    炒cc域名确实有人赚到钱,但对新手来说,这更像一门“高门槛、低流动性”的生意,赚的是认知差和时间差,亏的却是真金白银的续费成本,风险和收益完全不成正比,很多人看到.cc域名注册价便宜,几十块钱一年,就想着批量注册等升值,这个逻辑听着通畅,但实际操作起来,几乎每一步都踩在坑里,cc域名能不能赚钱,取决于你对“终端……

    2026年9月10日
    200
  • 虚拟机的英文缩写是什么,虚拟机常见英文叫法有哪些?

    虚拟机的英文缩写是VM,全称Virtual Machine,中文常叫“虚机”或“虚拟机实例”;在技术文档里,也常看到Guest OS、VM instance等叫法,但最通用、最标准的缩写就是VM,虚拟机英文缩写是什么?VM和常见叫法一次说清很多人在安装VMware Workstation或者看云服务器文档时,会……

    2026年9月12日
    600
  • 服务器的配置错误是什么意思|服务器配置问题解决指南

    服务器的配置错误是什么意思服务器的配置错误是指由于人为疏忽、理解偏差、流程缺陷或工具使用不当等原因,导致服务器软硬件(如操作系统、Web服务器、数据库、应用程序、防火墙、网络参数等)的设置参数偏离了安全、稳定、高效运行所需的最佳或正确状态,从而引发系统故障、性能下降、安全漏洞或服务中断等问题的现象,就是服务器……

    2026年2月10日
    14450
  • http查询服务器文件格式有哪些,怎么查文件格式

    开篇直接答案通过HTTP查询服务器文件格式,核心依据是响应头中的Content-Type字段,它使用MIME类型标识资源的具体媒体类型,例如text/html代表HTML文档,application/json代表JSON数据,image/jpeg代表JPEG图片, 浏览器和HTTP客户端根据这个字段解析并处理服……

    2026年8月13日
    1400
  • 新域名www.44ebeb.com是官方正规渠道吗,如何验证网站是否安全可靠

    关于www.44ebeb.com这个新域名,结论是:它属于原44ebeb站点的官方新入口,渠道正规性可以通过以下几个步骤直接验证,不必凭感觉猜测,44ebeb.com新域名上线背后发生了什么不少老用户发现原来的44ebeb旧地址忽然打不开,第一反应是“是不是跑路了”,这类带有工具属性的影视聚合站点,在国内网络环……

    服务器运维 2026年9月9日
    100
  • 个人搭建博客网站关系型分布式云原生数据库性能怎么样,自建博客用什么数据库

    对于个人搭建博客网站而言,关系型分布式云原生数据库在性能上完全胜任,且具备极高的扩展性和成本效益,但在单机小流量场景下,其运维复杂度可能高于传统单机数据库,选择数据库不仅仅是选择一个存储工具,更是选择一种架构理念,很多博主在起步阶段,往往纠结于MySQL单机还是PostgreSQL集群,却忽略了云原生架构带来的……

    2026年5月30日
    4200

发表回复

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