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
丽萨主机香港CMI VPS9折低至79.2元月ISP住宅原生IP值得买吗
下一篇 2026年6月29日 20:43

相关推荐

  • 个人网站与微博哪个更值得做?个人网站搭建教程

    个人网站是建立长期品牌资产和SEO权重的基石,而微博则是获取即时流量和维持用户活跃度的高效渠道,两者结合能实现“长尾搜索+即时互动”的流量闭环,在2026年的数字营销环境中,单纯依赖单一平台的风险日益增加,算法的更迭让很多创作者意识到,把鸡蛋放在一个篮子里并不安全,个人网站就像是你自己在互联网上的“房产”,拥有……

    2026年5月27日
    4300
  • 服务器怎么注册域名?服务器域名注册详细步骤教程

    服务器注册域名并完成解析是实现互联网服务对外发布的关键路径,其核心结论在于:域名注册仅是获取互联网“门牌号”的第一步,真正的技术难点在于域名实名认证、DNS解析配置以及与服务器IP的精准绑定,整个过程要求操作者具备严谨的规划能力,遵循ICANN及工信部相关规定,确保网站或应用的可访问性与合规性,域名与服务器的高……

    2026年3月15日
    9700
  • 高级计算机资格证书有什么用?高级计算机资格证怎么考

    考取高级计算机资格证书是2026年突破IT职场天花板、获取一线城市落户加分及核心项目投标资质的最优解,其含金量与政策红利远超普通水平认证,2026年高级计算机资格证书的核心价值与政策红利职场溢价与项目准入门槛在数字化转型深水区,高级证书已从“加分项”变为“准入证”,招投标硬性条件:根据2026年政府采购网最新数……

    服务器运维 2026年4月26日
    3900
  • 服务器密码登录访问失败怎么办?服务器密码登录失败常见原因及解决方法

    服务器密码登录访问失败,往往源于配置错误、权限异常或安全策略拦截,而非单纯密码输入错误,90%以上的此类问题可通过系统日志排查、权限校验与SSH服务配置复核快速定位并修复,以下从现象识别、根因分析、解决方案三方面展开,确保技术决策可执行、可验证、可复用,现象识别:确认问题真实发生先排除误判,避免无效排查:确认非……

    2026年4月15日
    6200
  • 服务器搭建手机云怎么做,手机云服务器搭建教程

    利用服务器资源构建专属手机云环境,是解决移动设备算力瓶颈、保障数据隐私的最优解,这种方案不仅能够释放高性能硬件的潜力,还能实现全天候在线的云端托管,彻底改变移动办公与娱乐的交互方式,通过服务器搭建手机云,用户可以将原本依赖本地硬件的任务迁移至云端,获得超越旗舰机型的流畅体验与绝对的数据控制权, 核心优势:为何选……

    2026年2月27日
    14500
  • 服务器怎么root权限获取,服务器root密码忘记怎么办

    获取服务器Root权限的核心在于通过合法的SSH密钥或密码认证登录,并利用系统命令切换至超级用户账户,整个过程必须建立在拥有合法授权的基础上,任何未经授权的尝试均属于非法入侵行为,对于合法的服务器管理员而言,掌握Root权限的获取与管理是运维工作的基础技能,这直接关系到服务器的安全配置与系统维护效率, Root……

    2026年3月23日
    13100
  • 个人云存储mysql服务器怎么用?搭建私有云nas方案

    搭建个人云存储MySQL服务器并非遥不可及的技术黑箱,通过部署轻量级容器化应用并结合Nginx反向代理,普通用户即可在家庭NAS或低配云服务器上实现稳定、高效且安全的数据私有化管理,很多人提到“个人云存储”和“MySQL服务器”,脑海中浮现的往往是昂贵的企业级硬件或复杂的代码编译过程,随着容器技术的普及,这一门……

    2026年6月17日
    2700
  • 服务器如何搭建博客,云服务器怎么建个人博客

    在服务器上构建博客是建立高权重、高自主性个人品牌的最佳技术路径,它不仅能摆脱第三方平台的限制,更能通过底层架构的优化实现极致的加载速度与SEO表现,相比于使用SaaS建站平台,自建服务器赋予了用户对操作系统、Web环境、数据库及安全策略的完全控制权,这种模式虽然对技术能力有一定要求,但通过合理的架构设计与自动化……

    2026年2月17日
    14900
  • 个人智能小程序源码是什么?个人开发小程序源码哪里找

    个人智能小程序源码是指开发者基于开源框架或低代码平台,自行编写、部署并拥有完全控制权的轻量级应用代码集合,它允许用户在不依赖第三方商业SaaS服务的情况下,独立构建具备特定业务逻辑的移动端应用,在数字化浪潮席卷各行各业的当下,许多个人开发者、小微创业者以及技术爱好者都在寻找一种低成本、高自主权的开发方式,传统的……

    2026年5月31日
    5100
  • 个人云服务器双十一怎么选?双十一云服务器优惠活动有哪些

    2026年个人云服务器双十一活动是降低建站与开发成本的最佳窗口期,建议优先选择支持按量付费且具备全球加速节点的高性价比机型,以实现性能与预算的完美平衡,2026年云服务器双十一价格趋势与选购逻辑随着云计算技术的成熟,2026年的双十一不再仅仅是简单的价格战,而是云服务商通过资源池化优化来提供更具竞争力的长期方案……

    2026年6月17日
    2810

发表回复

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