sqlmodel本身不直接防sql注入,但通过强制使用sqlalchemy参数化查询切断字符串拼接路径;只要不用text()手写原生sql、字段名经白名单校验、值通过模型操作符传入,即可有效防御。

SQLModel 本身不直接“防止 SQL 注入”,但它通过强制使用 SQLAlchemy 的参数化查询机制,从编码习惯层面切断了拼接 SQL 字符串的路径——只要你不用 text() 手动写原生 SQL,就几乎不可能写出可注入的语句。
SQLModel 的增删改查默认走参数化查询
SQLModel 底层完全复用 SQLAlchemy Core 的表达式语言(select()、insert() 等),所有字段值都作为绑定参数传入,而非字符串插值。这意味着你写 session.exec(select(User).where(User.name == name_input)),底层生成的是类似 SELECT * FROM user WHERE name = %s 的语句,name_input 被安全地送入数据库驱动的参数缓冲区。
常见错误是误以为“用了 SQLModel 就万事大吉”,结果在某个角落手写了:
session.execute(text(f"SELECT * FROM users WHERE name = '{name_input}'"))
这行代码立刻绕过所有防护,变成高危点。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- SQLModel 的所有标准操作(
exec()、add()、delete())都默认启用参数化 - 只要不主动调用
text()或connection.execute()拼接字符串,就不需要额外做转义 - 字段名、表名不能由用户输入动态决定;若真有此需求,必须用白名单校验(如
if field_name not in ["name", "email"]:)
用户输入进 where 条件时,必须用模型字段名 + 比较操作符
这是最容易踩坑的地方:把用户传来的字段名和值一起当条件用,比如想支持“按任意字段搜索”,然后写成:
# ❌ 危险!字段名未校验,值未参数化
session.exec(text(f"SELECT * FROM users WHERE {field} = '{value}'"))
正确做法是只允许有限字段,并用 SQLModel 的表达式构造条件:
# ✅ 安全:字段名硬编码或白名单校验,值走参数化
if field == "name":
stmt = select(User).where(User.name == value)
elif field == "email":
stmt = select(User).where(User.email == value)
else:
raise HTTPException(400, "Invalid field")
result = session.exec(stmt).all()
- 字段名永远不能来自用户输入,除非经过严格白名单过滤
- 值一律通过
==、like()等操作符传入,SQLModel 会自动转为绑定参数 -
like()也安全:User.name.like(f"%{keyword}%")→ 底层是WHERE name LIKE %s,%符号由 Python 拼,keyword仍为参数
与 FastAPI 依赖注入配合时,事务边界要清晰
SQLModel 不处理事务自动提交,但 FastAPI 的依赖注入常配合 sessionmaker 提供会话。如果在同一个 AsyncSession 或 Session 中混用 ORM 操作和手动 execute(text(...)),容易因异常导致事务未回滚,掩盖注入风险暴露后的数据污染。
- 一个请求生命周期内,尽量只用一种风格:纯 SQLModel 表达式,或纯
text()+ 显式参数字典 - 若必须用
text(),务必用命名参数:text("SELECT * FROM users WHERE id = :user_id"),再传{"user_id": user_id} - 异步场景下,
AsyncSession.execute()同样支持参数化,不要用await conn.execute(f"..." % ...)
真正危险的从来不是 SQLModel,而是开发者在“以为安全”的心理下,悄悄绕过它去拼 SQL 字符串。只要守住“不拼接、不信任字段名、不裸奔 text()”这三条线,SQLModel 就是你最省心的防注入屏障。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










