当前位置: 首页 > news >正文

FastAPI数据模型:使用FormData extra参数防止数据污染

在FastAPI中,使用Pydantic模型来定义表单字段时,确保传值的安全性是一个重要考虑。通过设置Pydantic模型的extra参数为"forbid",你可以增强API的安全性,确保只有预先定义并验证过的字段被接受。这有助于防止潜在的恶意数据注入或意外的错误数据,从而保护你的应用程序。
在这里插入图片描述

传值安全性的考虑:

  1. 防止不受信任的输入:限制只接受声明的字段可以防止用户提交可能影响API行为的未预期数据。

  2. 减少潜在的错误:通过禁止额外字段,可以减少因处理未定义字段而导致的潜在错误或异常。

  3. 增强数据验证:Pydantic模型提供了强大的数据验证功能,包括类型检查、格式验证和自定义验证逻辑。限制额外字段可以确保所有数据都经过这些验证步骤。

  4. 提高代码的可维护性:当API的输入明确且受控时,维护和更新API变得更加容易,因为开发者可以清楚地知道哪些字段是有效的。

示例代码:

from fastapi import FastAPI, Form
from pydantic import BaseModel, Extra, ValidationErrorapp = FastAPI()class User(BaseModel):username: stremail: strclass Config:extra = Extra.forbid  # 禁止额外的字段@app.post("/login/")
async def login(username: str = Form(...), email: str = Form(...)):# 这里可以添加你的登录逻辑return {"username": username, "email": email}@app.exception_handler(ValidationError)
async def validation_exception_handler(request, exc: ValidationError):return JSONResponse(status_code=400,content={"detail": exc.errors()},)# 测试额外字段
# 如果你尝试提交一个包含未声明字段的表单,比如 "extra_field",你将得到一个错误响应。

在这个示例中,我们定义了一个User模型,并设置了extra参数为Extra.forbid。我们还创建了一个login端点,它使用Form()来声明它期望接收表单数据。如果用户尝试提交包含未在User模型中声明的额外字段的表单,FastAPI将自动返回一个错误响应。

Config类

在Pydantic模型中,Config类是一个特殊的类,它用于定义模型的配置选项。model_configConfig类的一个实例属性,它是一个字典,包含了模型的各种配置设置。

extra配置选项是Config类中的一个键,它控制着模型如何处理额外的字段。在Pydantic模型中,extra可以有以下几个值:

  1. "allow":默认值。如果模型接收到未声明的额外字段,它们将被忽略,并且不会报错。

  2. "ignore":如果模型接收到未声明的额外字段,它们将被忽略,并且不会报错。与"allow"不同,"ignore"会将额外的字段从模型的字典表示中完全删除。

  3. "forbid":如果模型接收到未声明的额外字段,Pydantic将抛出一个ValidationError异常,指出模型中包含了额外的字段。

在你的代码示例中:

class FormData(BaseModel):username: strpassword: strmodel_config = {"extra": "forbid"}

model_config = {"extra": "forbid"} 这行代码意味着FormData模型被配置为禁止接收任何未在模型中声明的额外字段。如果尝试创建一个FormData实例,并传入额外的字段,比如:

data = FormData(username="user", password="pass", extra_field="value")

这将导致Pydantic抛出一个ValidationError,因为extra_field不是FormData模型的一部分。

这种配置增加了模型的严格性,确保只有明确声明的字段被包含在模型中,这有助于防止意外接收到不需要的数据,从而提高数据的安全性和模型的健壮性。


http://www.mrgr.cn/news/22109.html

相关文章:

  • Python——将原来的gt.txt文件存为gt_原始.txt,修改后的文件作为 gt.txt
  • 基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器
  • 开题报告中的研究方法设计:AI能帮你做什么?
  • 【Linux】进程控制(一)
  • 攻防世界--->你好,CTF
  • 使用协程实现高并发的I/O处理
  • 怎么仿同款小程序的开发制作方法介绍
  • RedNet 复现记录
  • 【进程间通信】System V--消息队列和信号量
  • 还不会剪音乐?试试这四款在线音频剪辑
  • JVM - GC垃圾回收
  • 【docker】通过云服务器安转Docker
  • 2024年土建施工员考试题库及答案
  • SprinBoot+Vue公交智能化系统的设计与实现
  • SwiftUI 中如何花样玩转 SF Symbols 符号动画和过渡特效
  • 【基础算法总结】滑动窗口
  • 仕考网:事业编考试考什么?
  • 【Python知识宝库】Python中的装饰器:优雅地扩展函数功能
  • 技术点:tailwindcss还要chrome插件