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

相关推荐

  • 杭州定制服务器品牌和配置怎么选,哪家性价比高?

    没有一家厂商会为单一客户开一条全新的服务器生产线,行业里所说的“定制”指的是基于标准硬件平台,按业务场景做深度配置调整和固件优化,而杭州市场的优势在于服务商密度高,选择面广,这篇文章会帮你理清杭州定制服务器的常见形态、配置思路、服务商资质判断方法,以及采购时容易踩的坑,让你在选型时心里有底,杭州定制服务器的三种……

    2026年8月26日
    700
  • 买手机域名要注意哪些坑,域名怎么选才靠谱?

    初买域名的人,最容易在“.手机”这个词上栽跟头:它不是一个后缀,而是一整套移动端寻址方案,买手机域名前最核心的一件事,是搞清楚你买的是“中文寻址入口”还是“传统网址”,这决定了后续备案、解析和续费的完全不同路径,手机域名是什么,先分清两类东西很多人把手机域名理解成“手机能访问的域名”,这个方向没问题,但落地上容……

    2026年9月17日
    100
  • gulpjs内容变化是什么?gulp4.0新特性详解

    Gulp 4.0 引入了基于 Promise 和 Async/Await 的新 API,彻底改变了任务依赖管理的逻辑,虽然它不再适合构建巨型单体应用,但在中小型项目、静态站点生成及轻量级前端工程化场景中,凭借极快的启动速度和灵活的插件生态,依然是开发者的高效选择,前端构建工具的历史是一部不断演进的技术史,从 G……

    2026年6月23日
    1810
  • 常见的app与服务器通信协议有哪些,是什么?

    App与服务器通信协议的核心答案很直接:现阶段九成以上的App走的是HTTP/HTTPS,实时性要求高的场景会叠加WebSocket,物联网设备则多采用MQTT协议,而追求极致性能的内部系统通常选择gRPC,这五种协议基本覆盖了市面上所有主流App的通信需求,剩下的TCP/UDP属于传输层底座,私有协议则是在这……

    服务器运维 2026年8月10日
    1600
  • 防火墙NAT双向转换的原理是什么?实际应用中如何操作和优化?

    防火墙NAT双向转换是一种关键的网络地址转换技术,它允许内部私有网络与外部公共网络之间实现双向通信,同时确保网络安全和地址资源的有效利用,通过动态或静态的映射机制,NAT双向转换不仅隐藏了内部网络结构,还解决了IP地址短缺问题,是现代企业网络架构中不可或缺的组成部分,NAT双向转换的核心原理NAT(Networ……

    2026年2月3日
    12600
  • gajs怎么用

    GAS(Google Apps Script)本质上是Google生态内的免费自动化脚本语言,通过浏览器即可编写,无需配置本地服务器,即可实现Google表格、文档、邮件及第三方API的自动化交互,很多人听到“编程”二字就头大,觉得需要安装复杂的开发环境,还要懂服务器运维,其实GAS完全打破了这个认知,它就像是……

    2026年6月23日
    2000
  • 服务器有系统吗?服务器操作系统详解

    是的,服务器必须安装操作系统,操作系统是服务器硬件与上层应用程序之间不可或缺的桥梁,负责管理硬件资源、提供基础服务并确保服务器稳定、安全、高效地运行,没有操作系统,服务器只是一堆无法有效协同工作的物理组件,无法执行任何有意义的计算任务或提供网络服务,服务器操作系统:不可或缺的核心服务器之所以被称为“服务器”,正……

    2026年2月13日
    11830
  • 服务器DHCP中继怎么配置,跨网段如何实现DHCP自动分配?

    DHCP中继(DHCP Relay)的核心作用是在不同广播域(VLAN)之间转发DHCP广播请求,使得位于不同子网的终端设备能够通过远程的DHCP服务器获取IP地址,DHCP中继的工作原理与核心逻辑在大型企业网络或复杂的园区网架构中,由于广播域的限制,DHCP客户端发出的广播请求(DHCP DISCOVER)无……

    2026年7月14日
    900
  • 服务器怎么关闭多个终端?Linux批量关闭终端方法

    要高效、安全地关闭服务器上的多个终端,核心结论是:优先使用系统命令进行批量筛选与终止,其次采用工具化管理,最后才考虑手动逐个关闭,这种分层处理策略能最大程度保障系统稳定性,避免误杀关键进程,同时大幅提升运维效率,对于运维人员而言,掌握pkill、kill等命令的组合用法,是解决服务器怎么关闭多个终端问题的关键所……

    2026年3月20日
    10800
  • 个人网站写什么好,个人网站写什么内容能吸引流量

    个人网站的核心价值在于构建个人品牌护城河与实现流量资产私有化,其内容应聚焦于展示专业深度、分享实战经验及提供独特视角,而非简单的日记记录,在2026年的互联网生态中,搜索引擎的算法逻辑已经从单纯的关键词匹配转向对用户意图与内容质量的深度理解,百度SEO不再仅仅是技术参数的堆砌,而是内容价值与用户体验的综合博弈……

    服务器运维 2026年5月25日
    4200

发表回复

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