Web安全
基础漏洞
01前端基础【HTML】
02前端基础【CSS】
03后端基础【PHP速通】
04后端基础【PHP面向对象】
05MySQL基础操作
06前后端联动【代码练习】
07SQL注入【1】
07SQL 注入【2】
08SQL注入 Labs
08SQL注入速查表
09XSS
09跨站脚本攻击【XSS】
09XSS Labs
10跨站请求伪造【CSRF】
11服务器端请求伪造【SSRF】
12XML 外部实体注入【XXE】
13代码执行漏洞
14命令执行漏洞
15文件包含漏洞
16文件上传漏洞
17反序列化漏洞
18业务逻辑漏洞
19未授权访问漏洞集合
20跨源资源共享【CORS】
21SSTI模板注入
22并发漏洞
23点击劫持【Clickjacking 】
24请求走私
25路径遍历
26访问控制
27身份验证漏洞
28WebSocket
29Web缓存中毒
30HTTP 主机头攻击
31信息泄露漏洞
32原型污染
33NoSQL注入
API 安全
01web应用程序
02HTTP协议
03API概述
04分类类型
05交换格式
06身份验证
07常见API漏洞
08crAPI靶场
09JWT
10OAuth 2.0身份验证
11GraphQL【1】
11GraphQL【2】
12DVGA靶场
13服务器端参数污染
14API文档
15API Labs
16OAuth Labs
17GraphQL API Labs
18JWT Labs
小程序
小程序抓包
数据库
MySQL
Oracle
MongoDB
Redis
PostgreSQL
SQL server
中间件
Nginx
Apache HTTP Server
IIS
Tomcat
框架
ThinkPHP
Spring
Spring Boot
Django
访问控制
-
+
首页
Django
 ## 概述 Django 是一个**高级 Python Web 框架**,遵循 “电池包含”(Batteries-included)设计哲学(即内置基础功能模块),旨在让开发者能够 “快速开发安全且可维护的网站”。它由 Adrian Holovaty 和 Simon Willison 于 2003 年在《劳伦斯日报》(Lawrence Journal-World)工作时开发,2005 年开源并成立 Django 软件基金会(DSF)。 Django 的核心目标是**消除重复劳动**(DRY 原则:Don't Repeat Yourself),通过内置丰富的组件(如 ORM、Admin 后台、认证系统),让开发者聚焦业务逻辑而非底层细节。广泛应用于内容管理系统(CMS)、社交网络、电商平台等场景,是 Python Web 开发中最成熟、使用最广泛的框架之一。 **官网地址**:https://www.djangoproject.com/ **官方文档地址**:https://docs.djangoproject.com/ **开源仓库**:https://github.com/django/django ## 历史与版本演进 Django 的版本迭代注重稳定性与安全性,关键版本及特性如下: - **2005 年**:首次开源,基于内部项目提炼,核心特性包括 ORM、Admin 后台、URL 路由。 - **2008 年**:1.0 版本发布,标志着框架成熟,确立 MVT 架构和 “电池包含” 理念。 - **2015 年**:1.8 版本(首个 LTS 版本)发布,支持 Python 3,引入模板继承增强,LTS 支持周期为 3 年。 - **2017 年**:2.0 版本发布,放弃 Python 2 支持,全面转向 Python 3.4+,简化 URL 路由语法(支持path()函数)。 - **2019 年**:3.0 版本发布,引入异步视图支持(基于 ASGI),原生支持 WebSocket,优化 ORM 性能。 - **2021 年**:4.0 版本发布,新增zoneinfo时区支持(替代pytz),改进模板引擎,强化安全特性。 - **2023 年**:4.2 版本(LTS)发布,支持 Python 3.8+,延长安全支持至 2026 年 12 月,是目前企业级应用的首选版本。 - **2024 年**:5.0 版本发布,要求 Python 3.10+,优化异步处理,增强类型提示,提升大型项目性能。 **版本策略**:每 8 个月发布一个主版本,LTS(长期支持)版本每 2 年发布一次,提供 3 年安全更新(普通版本仅支持 8 个月)。 ## 特点 **“电池包含” 哲学** 内置开发所需的几乎所有组件(ORM、Admin、认证、表单、缓存等),无需手动整合第三方库,开箱即用。例如:通过django.contrib.auth实现用户认证,django.contrib.admin生成管理后台,无需重复开发。 **遵循 DRY 原则** 强调代码复用,通过模板继承、包含标签({% include %})、通用视图(Generic Views)等机制,减少重复代码。例如:通用视图可一键实现 “列表展示”“详情页” 等常见功能,无需编写重复的视图逻辑。 **安全优先** 原生防护常见 Web 攻击: - 防 SQL 注入:ORM 自动参数化查询; - 防 XSS 攻击:模板自动转义 HTML; - 防 CSRF 攻击:表单内置csrf_token验证; - 防点击劫持:默认添加X-Frame-Options头; - 密码哈希存储:自动使用 PBKDF2 等算法加密密码。 **MVT 架构** 基于 “模型 - 视图 - 模板”(Model-View-Template)架构,清晰分离数据、逻辑与展示,便于团队协作和代码维护。 **可扩展性** 支持通过 “应用(App)” 和 “中间件(Middleware)” 扩展功能,第三方生态丰富(如 Django REST framework 用于 API 开发)。 **强大的 ORM** 抽象数据库操作,支持多种数据库(PostgreSQL、MySQL、SQLite、Oracle 等),通过 Python 代码而非 SQL 操作数据,且可无缝切换数据库后端。 ## 架构设计 Django 采用**MVT(Model-View-Template)架构**,是 MVC(Model-View-Controller)的变体,各组件职责如下: **Model(模型)**: 对应数据层,定义数据结构和业务规则,通过 ORM 与数据库交互。例如:User模型定义用户的用户名、密码、邮箱等字段,以及登录、注册等方法。 核心文件:models.py。 **View(视图)**: 对应逻辑层,处理用户请求,调用模型获取数据,传递给模板渲染。相当于 MVC 中的 “控制器(Controller)”。 核心文件:views.py(函数视图或类视图)。 **Template(模板)**: 对应展示层,定义 HTML 页面结构,接收视图传递的数据并动态渲染。相当于 MVC 中的 “视图(View)”。 核心文件:templates/目录下的 HTML 文件。 **URL 配置**: 作为 MVT 的 “调度中心”,将 URL 路径映射到对应的视图。核心文件:urls.py。 **请求处理流程**: 1. 用户发送 HTTP 请求(如/articles/1/); 2. URL 配置解析路径,匹配到对应的视图函数 / 类; 3. 视图调用模型获取数据(如查询 ID=1 的文章); 4. 视图将数据传递给模板; 5. 模板渲染 HTML,返回给用户。 ## 核心功能与组件 Django 的核心功能通过 “内置应用(contrib)” 和核心模块实现,覆盖 Web 开发全场景。 ### ORM(对象关系映射) **功能**:将 Python 类映射到数据库表,通过类方法 / 属性操作数据,无需编写 SQL。 **特性**:支持复杂查询(聚合、关联查询)、事务管理、数据库迁移(migrate命令)。 ```python # models.py from django.db import models class Article(models.Model): title = models.CharField(max_length=100) # 对应数据库varchar字段 content = models.TextField() # 对应text字段 pub_date = models.DateTimeField(auto_now_add=True) # 自动记录创建时间 # 使用ORM操作数据 article = Article(title="Django入门", content="Hello Django") article.save() # 插入数据 articles = Article.objects.filter(pub_date__year=2024) # 查询2024年的文章 ``` ### Admin 后台 **功能**:自动生成数据管理界面,支持增删改查、筛选、排序、批量操作,无需手动开发后台。 **使用**:注册模型到 Admin 即可启用: ```python # admin.py from django.contrib import admin from .models import Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'pub_date') # 列表页显示的字段 search_fields = ('title',) # 搜索框搜索的字段 ``` **访问**:启动项目后访问/admin/,使用超级用户登录(通过createsuperuser命令创建)。 ### 认证与权限系统 **功能**:内置用户管理(注册、登录、注销)、权限控制(基于角色的访问控制)。 **核心组件**: - django.contrib.auth.models.User:用户模型(用户名、密码、邮箱等); - @login_required:视图装饰器,限制未登录用户访问; - UserPassesTestMixin:类视图混入,验证用户权限(如仅管理员可访问)。 ```python from django.contrib.auth.decorators import login_required @login_required # 仅登录用户可访问 def my_profile(request): return render(request, 'profile.html') ``` ### 表单处理 **功能**:简化表单创建、数据验证、错误提示,支持绑定模型自动生成字段。 ```python # forms.py from django import forms from .models import Article class ArticleForm(forms.ModelForm): class Meta: model = Article fields = ['title', 'content'] # 绑定模型字段 widgets = { 'content': forms.Textarea(attrs={'rows': 5}) # 自定义控件 } # views.py def create_article(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): # 自动验证数据 form.save() # 保存到数据库 return redirect('article_list') else: form = ArticleForm() return render(request, 'create.html', {'form': form}) ``` ### URL 路由系统 **功能**:通过urls.py定义 URL 与视图的映射,支持正则表达式、路径参数、命名空间。 ```python # myapp/urls.py from django.urls import path from . import views urlpatterns = [ path('articles/', views.article_list, name='article_list'), # 列表页 path('articles/<int:pk>/', views.article_detail, name='article_detail'), # 详情页(接收pk参数) ] # 项目级urls.py(主路由) from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('myapp.urls')), # 包含子应用路由 ] ``` ### 中间件(Middleware) **功能**:在请求 / 响应处理的各个阶段插入自定义逻辑(如日志记录、身份验证、跨域处理)。 **内置中间件**: - SecurityMiddleware:添加安全相关 HTTP 头; - CsrfViewMiddleware:处理 CSRF 验证; - AuthenticationMiddleware:管理用户会话。 自定义中间件: ```python class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 请求处理前的逻辑(如记录访问时间) response = self.get_response(request) # 响应返回后的逻辑(如添加自定义头) response['X-Developer'] = 'Django' return response ``` ### 其他核心组件 **缓存框架**:支持多种缓存后端(内存、Redis、Memcached),通过cache_page装饰器缓存视图结果; **国际化(i18n)**:支持多语言翻译、时区转换,通过gettext实现文本国际化; **测试框架**:内置TestCase类,支持单元测试、集成测试,模拟请求和数据库交互; **静态文件管理**:通过django.contrib.staticfiles处理 CSS、JS、图片等静态资源,适合开发和生产环境。 ## 目录结构 一个典型的 Django 项目(包含一个应用myapp)结构如下: ```txt myproject/ # 项目根目录 ├─ manage.py # 命令行工具(启动服务、创建应用等) ├─ myproject/ # 项目配置目录(与项目同名) │ ├─ __init__.py │ ├─ asgi.py # ASGI配置(异步部署) │ ├─ settings.py # 项目核心配置(数据库、中间件、应用等) │ ├─ urls.py # 主URL配置(路由入口) │ └─ wsgi.py # WSGI配置(同步部署) └─ myapp/ # 应用目录(功能模块) ├─ __init__.py ├─ admin.py # Admin后台配置 ├─ apps.py # 应用配置 ├─ migrations/ # 数据库迁移文件(自动生成) │ └─ __init__.py ├─ models.py # 数据模型定义 ├─ forms.py # 表单定义(可选) ├─ tests.py # 测试代码 ├─ urls.py # 应用内URL配置(可选) ├─ views.py # 视图逻辑 └─ templates/ # 模板目录 └─ myapp/ # 模板子目录(避免与其他应用冲突) ├─ list.html └─ detail.html └─ static/ # 静态资源目录 └─ myapp/ # 静态资源子目录 ├─ style.css └─ script.js ``` ## 入口文件与启动方式 Django 的核心入口是 **manage.py**,这是一个命令行工具,用于执行项目管理命令。 **启动开发服务器:** ```bash python manage.py runserver # 默认监听127.0.0.1:8000 python manage.py runserver 0.0.0.0:8080 # 监听所有IP的8080端口 ``` 开发服务器仅用于开发环境,生产环境需使用 WSGI/ASGI 服务器(如 Gunicorn、Uvicorn)。 **创建应用**: ```bash python manage.py startapp myapp # 创建名为myapp的应用 ``` **数据库迁移**: ```bash python manage.py makemigrations # 根据模型生成迁移文件 python manage.py migrate # 执行迁移,创建数据库表 ``` **创建超级用户**(用于 Admin 后台登录): ```bash python manage.py createsuperuser ``` 生产环境中,Django 通过**WSGI(同步)** 或**ASGI(异步)** 接口与 Web 服务器(如 Nginx)对接,入口文件为myproject/wsgi.py或myproject/asgi.py。 ## 适用场景 Django 适合开发**功能复杂、数据密集、需要快速交付**的 Web 应用,典型场景包括: **内容管理系统(CMS)**:如博客、新闻网站、企业官网,利用 Admin 后台快速实现内容管理; **电商平台**:商品管理、订单系统、用户中心,依赖 ORM 和表单处理简化数据交互; **社交网络**:用户认证、权限控制、动态内容展示,内置安全特性保障用户数据安全; **企业内部系统**:CRM、OA 系统,通过 Admin 和权限系统快速搭建管理界面; **后台 API 服务**:结合 Django REST framework(DRF)开发 RESTful API,供前端 / 移动端调用。 ## 优劣势 ### 优势 **开发效率极高**:内置组件覆盖 80% 常见需求,Admin 后台、ORM、表单等功能可节省大量开发时间,中小型项目交付周期缩短 50% 以上; **安全性强**:原生防护 SQL 注入、XSS、CSRF 等攻击,无需手动实现安全逻辑; **文档完善**:官方文档详尽,包含入门教程、API 参考、最佳实践,新手易上手; **生态丰富**:第三方库成熟,如 DRF(API 开发)、django-allauth(第三方登录)、django-filter(高级筛选); **可维护性好**:MVT 架构清晰分离代码职责,DRY 原则减少重复代码,便于团队协作和长期维护。 ### 劣势 **相对重量级**:内置功能多,对简单应用(如静态网站)而言可能过于复杂,资源消耗高于轻量框架(如 Flask); **灵活性较低**:“电池包含” 哲学意味着框架约定较多,自定义底层行为(如 ORM 查询)较麻烦; **学习曲线较陡**:新手需理解 MVT 架构、ORM、中间件等概念,初期上手难度高于 Flask; **异步支持较新**:虽然 3.0 + 支持异步视图,但生态对异步的适配(如 ORM 异步操作)仍在完善中,不如 FastAPI 成熟; **性能瓶颈**:在高并发场景下(如每秒数万请求),性能不如 Go/Node.js 框架,需通过缓存、异步等手段优化。 ## WSGI 与 ASGI WSGI(同步)与 ASGI(异步)均是 Python 生态中**Web 服务器与应用程序之间的通信接口规范**,核心作用是定义标准化的交互协议,解决 “Web 服务器(如 Nginx)如何将请求传递给 Python 应用(如 Django/Flask),以及应用如何返回响应” 的问题。 两者的本质差异在于**并发模型**:WSGI 基于同步阻塞,ASGI 基于异步非阻塞,进而决定了它们在性能、协议支持和适用场景上的显著区别。 ### 定位 | 维度 | WSGI(Web Server Gateway Interface) | ASGI(Asynchronous Server Gateway Interface) | | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | **核心定义** | Python Web 应用的**同步标准接口**,19 年前诞生的 “传统规范” | Python Web 应用的**异步标准接口**,为解决异步需求而生的 “新规范” | | **核心目标** | 统一同步 Web 应用与服务器的通信方式,解决 “协议碎片化” 问题 | 支持异步编程模型,同时兼容 WSGI,扩展对实时协议的支持 | | **规范文档地址** | [PEP 3333](https://peps.python.org/pep-3333/)(WSGI 1.0 最终版) | [ASGI 官方文档](https://asgi.readthedocs.io/) | | **定位** | Python Web 生态的 “过去与现在”,仍主导传统同步应用 | Python Web 生态的 “未来”,主导高并发、实时场景 | ### 核心特性对比 | 特性 | WSGI(同步) | ASGI(异步) | | -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | **并发模型** | 同步阻塞:1 个请求对应 1 个线程 / 进程,处理期间阻塞其他请求 | 异步非阻塞:基于 “事件循环”,1 个线程可处理多个请求(I/O 等待时切换任务) | | **协议支持** | 仅支持 HTTP/1.0/1.1(短连接) | 支持 HTTP/1.1、HTTP/2、WebSocket、SSE(长连接 / 实时协议) | | **连接处理** | 仅支持 “短连接”:请求响应后立即断开连接 | 支持 “长连接”:可维持连接用于实时数据传输(如 WebSocket 双向通信) | | **兼容性** | 不兼容 ASGI 应用 | 兼容 WSGI 应用(可通过适配器运行 WSGI 应用,如 asgiref.wsgi.WsgiToAsgi) | | **任务调度** | 依赖线程 / 进程池(如 Gunicorn 的 worker 进程) | 依赖异步事件循环(如 asyncio) | | **I/O 密集场景表现** | 差:I/O 等待(如数据库查询、API 调用)时阻塞线程 | 优:I/O 等待时释放线程处理其他请求,资源利用率高 | ### WSGI 的工作流程 WSGI 采用 “三层架构”:**Web 服务器 → WSGI 服务器 → WSGI 应用**,流程完全同步: 1. **接收请求**:用户发送 HTTP 请求,先由 Web 服务器(如 Nginx)接收(负责静态资源处理、负载均衡)。 2. **转发请求**:Web 服务器将动态请求(如 /api/user)转发给 WSGI 服务器(如 Gunicorn)。 3. **调用应用**:WSGI 服务器启动线程 / 进程,调用 WSGI 应用(如 Django)的 application 函数(WSGI 核心入口),传递 environ(请求信息)和 start_response(响应回调)。 4. **返回响应**:应用处理请求后,通过 start_response 返回响应状态码和头信息,再返回响应体;WSGI 服务器将响应转发给 Web 服务器,最终返回给用户。 5. **阻塞问题**:若应用处理过程中存在 I/O 等待(如查询数据库耗时 1 秒),则当前线程 / 进程会被 “阻塞”,无法处理其他请求,导致高并发下性能骤降。 ### ASGI 的工作流程 ASGI 在 WSGI 基础上引入 “事件循环” 和 “异步应用”,采用 “四层架构”:**Web 服务器 → ASGI 服务器 → ASGI 中间件 → ASGI 应用**,流程异步化: 1. **接收请求**:Web 服务器(如 Nginx)接收请求,将动态请求转发给 ASGI 服务器(如 Uvicorn)。 2. **事件循环调度**:ASGI 服务器内置 asyncio 事件循环,将请求封装为 “任务”(Task),放入事件循环队列。 3. **异步调用应用**:事件循环调度异步应用(如 FastAPI)的 app 函数(ASGI 核心入口),传递 scope(请求上下文,如协议类型)、receive(异步接收请求数据的函数)、send(异步发送响应数据的函数)。 4. **非阻塞处理**:若应用执行 I/O 操作(如 await db.query()),会通过 await 释放事件循环,转而处理其他任务;待 I/O 操作完成后,事件循环再回调当前任务继续执行。 5. **返回响应**:应用处理完成后,通过 send 函数异步返回响应;ASGI 服务器将响应转发给 Web 服务器,最终返回给用户。 6. **长连接支持**:对于 WebSocket 等长连接请求,ASGI 服务器会维持连接,通过 receive/send 持续传递实时数据,无需频繁断开连接。 ### WSGI 生态组件 | 类型 | 代表工具 / 框架 | | ----------------- | ------------------------------------------------------------ | | **WSGI 服务器** | - **Gunicorn**:最常用的 WSGI 服务器,轻量稳定,支持多进程 / 线程调度 <br />- **uWSGI**:高性能,支持多种协议(如 uwsgi 协议),适合生产环境 <br />- **mod_wsgi**:Apache 服务器的 WSGI 模块,需与 Apache 绑定 | | **WSGI 应用框架** | - **Django**(≤3.0 仅支持 WSGI,3.1+ 支持 ASGI) <br />- **Flask**:轻量级微框架,默认 WSGI <br />- **Pyramid**:灵活的全栈框架 <br />- **Tornado**(早期支持 WSGI,后期转向异步) | ### ASGI 生态组件 | 类型 | 代表工具 / 框架 | | ----------------- | ------------------------------------------------------------ | | **ASGI 服务器** | - **Uvicorn**:基于 asyncio 的高性能 ASGI 服务器,FastAPI 官方推荐 <br />- **Hypercorn**:支持 asyncio/trio 多事件循环,兼容性好 <br />- **Daphne**:Django 官方开发的 ASGI 服务器,专为 Django 异步优化 | | **ASGI 应用框架** | - **FastAPI**:现代高性能 API 框架,原生支持 ASGI,自动生成接口文档 <br />- **Starlette**:轻量级 ASGI 框架,专注异步功能,FastAPI 基于其开发 <br />- **Django 3.1+**:新增 asgi.py 入口,支持 ASGI 部署 <br />- **Sanic**:高性能异步框架,对标 Node.js/Go 的并发能力 | | **ASGI 中间件** | - **asgiref**:提供 WSGI 转 ASGI 适配器、异步测试工具 <br />- **django-channels**:Django 的 ASGI 扩展,支持 WebSocket、SSE 等 | ### 部署最佳实践 **WSGI 部署**:Nginx(静态资源 + 负载均衡)→ Gunicorn(WSGI 服务器,多进程配置)→ Django/Flask。 **ASGI 部署**:Nginx(静态资源 + 反向代理)→ Uvicorn(ASGI 服务器,多 worker + 事件循环)→ FastAPI/Django ASGI。
毛林
2025年9月12日 20:52
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码