0

0

Django模板:实现HTML标签安全白名单与XSS防护

心靈之曲

心靈之曲

发布时间:2025-10-31 12:49:28

|

584人浏览过

|

来源于php中文网

原创

Django模板:实现HTML标签安全白名单与XSS防护

本教程旨在解决在django模板中安全地展示用户输入html内容的挑战,即只允许特定的html标签(如`br`, `italic`, `strong`, `ul`, `li`)出现,同时有效防范跨站脚本(xss)攻击。我们将详细介绍如何利用python的`bleach`库实现精细的html标签白名单过滤,确保内容显示既符合业务需求又兼顾安全性。

在Web应用开发中,允许用户输入HTML内容并将其直接渲染到页面上是一个常见的需求,例如富文本编辑器或评论系统。然而,直接使用Django模板的|safe过滤器虽然能将HTML标记为安全并避免转义,但这种做法存在严重的安全隐患。|safe过滤器会允许所有HTML标签,包括恶意脚本(如<script>标签),从而使应用容易遭受跨站脚本(XSS)攻击。XSS攻击可能导致用户会话劫持、数据泄露或网站内容篡改。

为了在满足业务需求的同时保障安全性,我们需要一种机制来严格控制允许显示的HTML标签,即实现一个HTML标签的白名单过滤。

引入 bleach 库进行内容净化

bleach 是一个强大的Python库,由Mozilla开发,专门用于从不受信任的字符串中清除HTML标签和属性,使其可以安全地在浏览器中显示。它通过明确的白名单机制工作,这意味着只有明确允许的标签和属性才会被保留,其他所有内容都将被移除或转义。

安装 bleach

首先,您需要通过pip安装bleach库:

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

pip install bleach

定义允许的HTML标签

bleach 的核心功能之一是允许您精确定义哪些HTML标签是安全的。这通过一个简单的列表来实现。例如,如果您的需求是只允许<br>, <i> (或italic), <strong>, <ul> 和 <li> 标签,您可以这样定义:

ALLOWED_TAGS = ['br', 'i', 'strong', 'ul', 'li']
# 注意:HTML标签通常是小写,bleach会自动处理大小写。
# 'italic'在HTML中是<i>,这里我们直接使用'i'

使用 bleach.clean() 进行内容净化

定义了允许的标签列表后,就可以使用 bleach.clean() 方法来处理用户输入的内容。这个方法会遍历输入字符串,移除所有不在 tags 参数中指定的标签。

import bleach

# 定义允许的标签列表
ALLOWED_TAGS = ['br', 'i', 'strong', 'ul', 'li']

# 示例用户输入,包含允许和不允许的标签
user_input = '<p>这是一个 <strong>示例</strong>,其中包含<i>一些</i>文本和<script>alert("XSS");</script>。</p><ul><li>列表项1</li><li>列表项2</li></ul><br>'

# 使用bleach.clean()进行净化
cleaned_user_input = bleach.clean(user_input, tags=ALLOWED_TAGS)

print("原始输入:")
print(user_input)
print("\n净化后的输出:")
print(cleaned_user_input)

运行上述代码,您将得到如下输出:

原始输入:
<p>这是一个 <strong>示例</strong>,其中包含<i>一些</i>文本和<script>alert("XSS");</script>。</p><ul><li>列表项1</li><li>列表项2</li></ul><br>

净化后的输出:
这是一个 <strong>示例</strong>,其中包含<i>一些</i>文本和。<ul><li>列表项1</li><li>列表项2</li></ul><br>

从输出中可以看出,<p> 标签和 <script> 标签都被成功移除了,而 <strong>, <i>, <ul>, <li> 和 <br> 标签则被保留。

社研通
社研通

文科研究生的学术加速器

下载

在Django中集成 bleach

在Django应用中,您可以将 bleach 集成到视图逻辑中,或者创建一个自定义的模板过滤器。

方法一:在视图中处理数据

这是最推荐的做法,因为它确保了在数据保存到数据库或传递到模板之前,内容就已经被净化。

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

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

def display_user_content(request):
    raw_content = request.POST.get('user_html_input', '') # 假设从表单获取

    # 净化用户输入
    cleaned_content = bleach.clean(raw_content, tags=ALLOWED_TAGS)

    # 将净化后的内容传递给模板
    context = {'display_content': cleaned_content}
    return render(request, 'my_template.html', context)

# my_template.html
<!DOCTYPE html>
<html>
<head>
    <title>用户内容展示</title>
</head>
<body>
    <h1>用户生成内容</h1>
    <div>
        {{ display_content|safe }} {# 注意:这里仍然需要|safe,因为内容已经被bleach净化,现在是安全的 #}
    </div>
</body>
</html>

方法二:创建自定义模板过滤器

如果您希望在模板层面进行净化(例如,在展示数据库中未净化的旧数据时),可以创建自定义模板过滤器。

# myapp/templatetags/bleach_filters.py
from django import template
import bleach

register = template.Library()

ALLOWED_TAGS = ['br', 'i', 'strong', 'ul', 'li']
# 您还可以定义允许的属性,例如:
# ALLOWED_ATTRIBUTES = {
#     '*': ['class', 'id'], # 允许所有标签有class和id属性
#     'a': ['href', 'title'], # 允许a标签有href和title属性
# }

@register.filter(name='bleach_clean')
def bleach_clean_filter(value):
    """
    使用bleach库净化HTML内容,只保留白名单中的标签。
    """
    if not isinstance(value, str):
        return value
    return bleach.clean(value, tags=ALLOWED_TAGS) #, attributes=ALLOWED_ATTRIBUTES)

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

{% load bleach_filters %}

<!DOCTYPE html>
<html>
<head>
    <title>用户内容展示</title>
</head>
<body>
    <h1>用户生成内容</h1>
    <div>
        {{ user_raw_content|bleach_clean|safe }}
    </div>
</body>
</html>

请注意,即使使用了 bleach_clean 过滤器,最终在模板中显示时,仍然需要加上 |safe 过滤器,因为 bleach 返回的是一个普通的字符串,Django模板引擎默认会对其进行HTML转义。|safe 告诉Django这个字符串已经被净化,可以安全地渲染为HTML。

注意事项与最佳实践

  1. 始终优先在后端净化: 最佳实践是在数据保存到数据库之前或从数据库读取后、渲染到模板之前,在视图或模型层进行内容净化。这确保了数据库中存储的是干净的数据。
  2. 明确的白名单策略: 仔细考虑您的应用需要哪些HTML标签和属性,并只将它们添加到白名单中。任何未明确允许的都应该被移除。bleach 默认会移除所有属性,如果您需要允许特定属性(例如 <a> 标签的 href),需要通过 attributes 参数显式指定。
  3. 不仅仅是标签: bleach 不仅可以过滤标签,还可以过滤HTML属性 (attributes 参数) 和 CSS 样式 (styles 参数)。对于更复杂的富文本场景,这些功能非常有用。
  4. 结合其他安全措施: bleach 是XSS防护的重要一环,但并非唯一手段。它应该与其他安全措施结合使用,例如输入验证、输出编码、内容安全策略(CSP)等,以构建一个多层次的安全防御体系。
  5. 性能考虑: 对于处理大量或非常大的HTML字符串,bleach 的净化操作可能会有轻微的性能开销。在大多数Web应用场景中,这种开销通常可以忽略不计。

通过遵循这些指导原则并利用 bleach 库,您可以在Django应用中安全、灵活地处理用户输入的HTML内容,有效防止XSS攻击,同时保持页面内容的丰富性。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

169

2026.02.04

pip安装使用方法
pip安装使用方法

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

373

2023.10.09

更新pip版本
更新pip版本

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

437

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、保存并关闭文件即可。

805

2024.12.23

python升级pip
python升级pip

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

371

2025.07.23

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

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

761

2023.08.03

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

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

221

2023.09.04

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

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

1570

2023.10.24

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

4

2026.03.16

热门下载

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

精品课程

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

共14课时 | 1.0万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43.8万人学习

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

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