0

0

Django模板中安全地过滤特定HTML标签:使用Bleach库实现内容白名单

聖光之護

聖光之護

发布时间:2025-10-31 13:17:01

|

289人浏览过

|

来源于php中文网

原创

Django模板中安全地过滤特定HTML标签:使用Bleach库实现内容白名单

本文深入探讨如何在django应用中安全地处理用户输入的html内容,以有效防止跨站脚本(xss)攻击,同时仅允许显示预定义的特定html标签。我们将详细介绍如何利用python的`bleach`库,通过构建标签白名单机制,实现对用户输入html的精确净化,确保在前端页面安全、合规地渲染内容。

在现代Web应用中,允许用户输入并显示HTML内容是一种常见需求,例如富文本编辑器或评论区。然而,直接将用户输入的HTML渲染到页面上存在巨大的安全风险,尤其是跨站脚本(XSS)攻击。恶意用户可能会注入

为了解决这一问题,我们需要一种机制来过滤用户输入的HTML,只保留一个预定义的、安全的标签白名单。Python的bleach库正是为此而生,它提供了一个强大而灵活的HTML清洗工具

为什么选择Bleach?

Django自带的safe过滤器仅仅是标记字符串为“安全”,告诉模板引擎不要对其进行HTML转义。这意味着如果用户输入了并使用|safe渲染,该脚本会直接执行。这显然不是我们想要的结果。

bleach库则不同,它是一个专门用于清理和消毒HTML的第三方库。它允许开发者定义一个允许的HTML标签、属性、样式和协议的白名单,然后从输入的HTML中移除所有不在白名单中的内容,从而有效地抵御XSS攻击。

立即学习前端免费学习笔记(深入)”;

安装Bleach

首先,你需要在你的Python环境中安装bleach库。通过pip可以轻松完成:

pip install bleach

使用Bleach进行HTML内容过滤

bleach的核心功能体现在其clean()方法上。以下是如何定义允许的HTML标签并使用bleach.clean()来过滤用户输入的示例:

假设我们只允许用户输入
(换行)、(斜体)、(加粗)、

    (无序列表)和
  • (列表项)这五种HTML标签。

import bleach

# 定义允许的HTML标签白名单
# 注意:bleach默认会移除所有不在白名单中的标签及其内容,
# 但可以通过指定strip=False来保留标签内容,只移除标签本身。
ALLOWED_TAGS = ['br', 'i', 'strong', 'ul', 'li']

# 示例用户输入,包含允许和不允许的标签,以及潜在的恶意脚本
user_input = """

这是一个 示例 内容,包含 斜体
换行。

WPS AI
WPS AI

金山办公发布的AI办公应用,提供智能文档写作、阅读理解和问答、智能人机交互的能力。

下载
  • 列表项1
  • 列表项2
点击我 """ # 使用bleach.clean()进行过滤 # tags参数接受一个列表,指定允许的HTML标签 # strip参数默认为True,表示移除不允许的标签及其内容。 # 如果想保留内容,只移除标签本身,可以设置为False。 cleaned_user_input = bleach.clean(user_input, tags=ALLOWED_TAGS, strip=True) print("--- 原始输入 ---") print(user_input) print("\n--- 过滤后的输出 ---") print(cleaned_user_input)

输出结果:

--- 原始输入 ---

这是一个 示例 内容,包含 斜体
换行。

  • 列表项1
  • 列表项2
点击我 --- 过滤后的输出 --- 这是一个 示例 内容,包含 斜体
换行。
  • 列表项1
  • 列表项2

从输出可以看出,

标签、

Django中的集成与最佳实践

在Django应用中,你可以在视图函数、表单的clean()方法或自定义模板过滤器中调用bleach.clean()。

1. 在视图函数中处理

# your_app/views.py
from django.shortcuts import render
import bleach

ALLOWED_TAGS = ['br', 'i', 'strong', 'ul', 'li']

def display_user_content(request):
    user_raw_html = request.POST.get('content', '') # 假设从POST请求获取

    # 在传递给模板之前进行清洗
    cleaned_html = bleach.clean(user_raw_html, tags=ALLOWED_TAGS, strip=True)

    context = {
        'safe_content': cleaned_html
    }
    return render(request, 'your_template.html', context)

然后在Django模板中,你可以安全地渲染这个已清洗过的HTML:


用户提交内容:

{{ safe_content|safe }} {# 此时使用|safe是安全的,因为内容已经过bleach清洗 #}

2. 创建自定义模板过滤器

为了更好地复用和保持模板的简洁性,你可以创建一个自定义模板过滤器来封装bleach的逻辑。

首先,在你的Django应用目录下创建一个templatetags文件夹(如果不存在),并在其中创建一个Python文件,例如my_filters.py:

# your_app/templatetags/my_filters.py
from django import template
import bleach

register = template.Library()

ALLOWED_TAGS_FOR_CONTENT = ['br', 'i', 'strong', 'ul', 'li']
# 也可以定义其他用途的标签列表,例如评论区可以允许更少的标签

@register.filter
def bleach_html(value):
    """
    使用bleach清洗HTML内容,只保留预定义的安全标签。
    """
    if not isinstance(value, str):
        return value
    return bleach.clean(value, tags=ALLOWED_TAGS_FOR_CONTENT, strip=True)

# 如果需要更灵活的标签控制,可以考虑传入标签列表作为参数
# 但模板过滤器传参通常只支持一个,复杂场景建议在视图中处理
# @register.filter
# def bleach_html_with_tags(value, tags_str):
#     if not isinstance(value, str):
#         return value
#     allowed_tags = [tag.strip() for tag in tags_str.split(',')]
#     return bleach.clean(value, tags=allowed_tags, strip=True)

然后,在你的Django模板中加载并使用这个过滤器:


{% load my_filters %}

用户提交内容:

{# 假设 user.profile.bio 包含用户输入的HTML #} {{ user.profile.bio|bleach_html|safe }} {# 先清洗,再标记为安全 #}

注意: 即使使用了自定义过滤器,最终渲染时仍然需要加上|safe,因为bleach_html过滤器返回的是一个普通的字符串,Django模板引擎在autoescape模式下依然会对其进行转义。|safe的作用是告诉模板引擎,这个字符串是安全的,可以直接作为HTML输出。

注意事项与总结

  • 白名单原则:始终采用白名单机制,即只允许明确批准的标签和属性,而不是尝试黑名单禁止所有已知恶意内容。黑名单容易遗漏新的攻击向量。
  • 属性和样式:bleach不仅可以过滤标签,还可以通过attributes和styles参数控制允许的HTML属性和CSS样式。例如,bleach.clean(html, tags=['a'], attributes={'a': ['href', 'title']})。
  • 协议:对于href、src等可能包含URL的属性,bleach允许通过protocols参数限制允许的协议(如http, https, mailto),以防止javascript:等恶意协议。
  • 清理时机:HTML清理操作应该在数据存储到数据库之前进行,或者在从数据库读取后、渲染到模板之前进行。通常建议在数据进入应用层时就进行清洗,例如在表单验证或模型保存前。
  • 用户体验:在清理HTML时,如果移除了用户输入的某些标签,最好能给用户一些反馈,例如说明允许的标签列表,或者在前端富文本编辑器中限制可用的功能。

通过bleach库,我们可以有效地在Django应用中实现对用户输入HTML的安全过滤,仅允许特定的HTML标签显示,从而在提供丰富内容展示能力的同时,极大地增强了应用的安全性,有效防范了XSS攻击。这是一个在处理用户生成内容时不可或缺的安全实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

339

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

415

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

761

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

349

2025.07.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 25.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号