在 FastAPI 中,确保应用程序的安全性是一个重要的方面。以下是一些安全性的第一步建议:

1. 输入验证: 使用 Pydantic 模型来定义请求和响应的数据结构,以及输入参数的类型。Pydantic 提供了强大的数据验证和转换功能,可以帮助防止不良输入。
   from pydantic import BaseModel

   class Item(BaseModel):
       name: str
       description: str = None

2. 路径参数和查询参数验证: 使用路径参数和查询参数时,确保对输入进行验证。FastAPI 支持在路径操作中使用参数的方式来验证输入。
   from fastapi import FastAPI

   app = FastAPI()

   @app.get("/items/{item_id}")
   async def read_item(item_id: int, query_param: str = None):
       return {"item_id": item_id, "query_param": query_param}

3. 身份验证: 使用 FastAPI 提供的 Depends 和 fastapi.security 模块来进行身份验证。支持的身份验证方式包括 OAuth2、API 密钥、Cookie 等。
   from fastapi import Depends, FastAPI, HTTPException
   from fastapi.security import OAuth2PasswordBearer

   app = FastAPI()
   oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

   @app.get("/items/")
   async def read_items(token: str = Depends(oauth2_scheme)):
       return {"token": token}

4. 密码哈希: 使用密码哈希库(例如 Passlib)来安全地存储和验证用户密码。避免在数据库中存储明文密码。
   from passlib.context import CryptContext

   pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

   def verify_password(plain_password, hashed_password):
       return pwd_context.verify(plain_password, hashed_password)

   def get_password_hash(password):
       return pwd_context.hash(password)

5. HTTPS: 在生产环境中始终使用 HTTPS,以加密数据在传输过程中的安全性。配置反向代理(例如 Nginx 或 Apache)来提供 HTTPS 支持。
   uvicorn main:app --host 0.0.0.0 --port 8000 --ssl-keyfile=key.pem --ssl-certfile=cert.pem

6. 跨域资源共享(CORS): 如果你的应用允许跨域请求,请使用 FastAPI 内置的 fastapi.middleware.cors.CORSMiddleware 中间件进行配置,以确保安全的跨域资源共享。
   from fastapi.middleware.cors import CORSMiddleware

   app.add_middleware(
       CORSMiddleware,
       allow_origins=["*"],
       allow_credentials=True,
       allow_methods=["*"],
       allow_headers=["*"],
   )

这些步骤是确保 FastAPI 应用程序基本安全性的一部分。在开发和部署应用程序时,还需要考虑其他方面,如错误处理、日志记录、数据库安全、安全头部设置等。不断了解和遵循最新的 Web 安全最佳实践是确保应用程序安全性的关键。


转载请注明出处:http://www.pingtaimeng.com/article/detail/7390/FastAPI