讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

如何在FastAPI中结合SQLAlchemy安全处理用户输入

老明大大_8296

老明大大_8296

发布时间:2026-11-10 11:33:38

|

936人浏览过

|

来源于php中文网

原创

SQLAlchemy本身不校验用户输入,安全处理必须靠Pydantic模型+显式数据库约束+参数化查询三者配合;Pydantic需启用from_attributes=True,字段加长度/正则等约束,密码用SecretStr,SQL查询必须参数化,数据库层补unique/index/外键等约束,异步场景注意AsyncSession生命周期和expire_on_commit配置。

如何在fastapi中结合sqlalchemy安全处理用户输入

直接说结论:SQLAlchemy 本身不校验用户输入,安全处理必须靠 Pydantic 模型 + 显式数据库约束 + 参数化查询三者配合,缺一不可。

Pydantic Schema 必须启用 from_attributes=True

很多人把 Pydantic 模型当“只是个类型提示”,结果在 db.query(User).filter(User.email == user_in.email) 里直接拼接字符串,这是典型误区。正确做法是先用 Pydantic 验证并清洗输入,再传给 SQLAlchemy:

  • from_attributes=True 是关键配置,否则 UserCreate(**data) 无法从 ORM 实例反向构造(比如从数据库读出后返回给前端)
  • 字段要加 min_length、max_length、regex 等约束,例如邮箱字段用 EmailStr 或正则 r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
  • 密码字段必须用 SecretStr 包裹,避免日志或调试输出明文

SQLAlchemy 查询必须用参数化,禁用字符串格式化

错误示例:session.execute(f"SELECT * FROM users WHERE email = '{email}'") —— 这等于主动打开 SQL 注入大门。

正确写法只有两种:

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载
  • ORM 方式:session.query(User).filter(User.email == email).first()(SQLAlchemy 自动参数化)
  • 原生 SQL 方式:session.execute(text("SELECT * FROM users WHERE email = :email"), {"email": email}),:email 是占位符,不能写成 %s 或 {email}
  • 特别注意:filter_by() 只接受关键字参数,不支持表达式,复杂条件必须用 filter()

数据库层要补上约束,别全指望应用层

Pydantic 和 SQLAlchemy 都可能被绕过(比如直连数据库、迁移脚本、管理后台),所以表结构本身必须带约束:

  • email 字段设为 unique=True, index=True,并确保数据库实际生效(SQLite 默认不强制 unique,PostgreSQL/MySQL 才真校验)
  • 密码哈希后存入,字段长度至少 String(128)(bcrypt 输出约 60 字符,留余量)
  • 敏感字段如 phone、id_card 建议加密存储,用 pgcrypto(PostgreSQL)或应用层 AES 加密,别裸存
  • 外键必须显式声明 ForeignKey("users.id") 并配 ondelete="CASCADE" 或 "RESTRICT",防止脏数据

异步场景下 session 生命周期容易失控

用 sqlalchemy[asyncio] 时,常见错误是把 AsyncSession 当全局变量用,或在依赖注入中忘了 await 关闭:

  • 依赖函数必须是 async def get_db(),且用 async with AsyncSessionLocal() as session: 包裹
  • 别在中间件或 background task 里复用 session,每个请求一个独立会话
  • expire_on_commit=False 要设,否则 commit() 后对象属性变 None,导致后续取值报 DetachedInstanceError
  • 如果用 session.merge() 更新对象,记得 await session.refresh(obj) 同步最新状态,不然返回的是旧值

最常被忽略的一点:环境变量里的数据库密码和 JWT 密钥绝不能硬编码,也别用 .env 文件提交到 Git —— 即使是私有仓库,也要通过 CI/CD 注入或云服务密钥管理器加载。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

574

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

736

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

619

2026.06.16

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

3125

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

4181

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

3491

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

1087

2023.09.05

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn