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

传值安全性的考虑:
-
防止不受信任的输入:限制只接受声明的字段可以防止用户提交可能影响API行为的未预期数据。
-
减少潜在的错误:通过禁止额外字段,可以减少因处理未定义字段而导致的潜在错误或异常。
-
增强数据验证:Pydantic模型提供了强大的数据验证功能,包括类型检查、格式验证和自定义验证逻辑。限制额外字段可以确保所有数据都经过这些验证步骤。
-
提高代码的可维护性:当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_config是Config类的一个实例属性,它是一个字典,包含了模型的各种配置设置。
extra配置选项是Config类中的一个键,它控制着模型如何处理额外的字段。在Pydantic模型中,extra可以有以下几个值:
-
"allow":默认值。如果模型接收到未声明的额外字段,它们将被忽略,并且不会报错。 -
"ignore":如果模型接收到未声明的额外字段,它们将被忽略,并且不会报错。与"allow"不同,"ignore"会将额外的字段从模型的字典表示中完全删除。 -
"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模型的一部分。
这种配置增加了模型的严格性,确保只有明确声明的字段被包含在模型中,这有助于防止意外接收到不需要的数据,从而提高数据的安全性和模型的健壮性。
