FastAPI 安全配置指南

FastAPI 是一个现代化的 Python Web 框架,提供了快速开发 API 的能力。为了确保应用的安全性,我们需要配置一些关键的安全设置。以下是关于如何在 FastAPI 中避免文档暴露以及其他安全配置的详细指南。

1. 禁用文档接口

你可以通过设置 docs_urlredoc_urlNone 来禁用 Swagger UI 和 ReDoc 文档接口。

python 复制代码
from fastapi import FastAPI

app = FastAPI(docs_url=None, redoc_url=None)

2. 隐藏部分接口

使用 include_in_schema=False 参数可以隐藏部分接口。

python 复制代码
from fastapi import FastAPI

app = FastAPI()

@app.post("/login", include_in_schema=False)
def login(params: LoginInfo):
    # 登录逻辑
    pass

3. 使用环境变量控制文档显示

根据环境变量决定是否显示文档。

python 复制代码
import os
from fastapi import FastAPI

env = os.getenv('env')

if env != 'develop':
    app = FastAPI(docs_url=None, redoc_url=None)
else:
    app = FastAPI()

4. HTTPS 配置

使用 HTTPS 加密数据传输,保护敏感信息。

  • 重要性: HTTPS 防止数据被拦截或篡改。
  • 实现方式: 使用 SSL/TLS 证书,通过 Uvicorn 启用 HTTPS。
bash 复制代码
uvicorn main:app --host 0.0.0.0 --port 8000 --cert /path/to/cert.pem --key /path/to/key.pem

5. 安全头部配置

添加安全头部防止 XSS、Clickjacking 等攻击。

  • 重要性: 防止常见的 Web 攻击。
  • 实现方式: 使用 FastAPI 中间件添加安全头部。
python 复制代码
from fastapi import FastAPI, Response
from fastapi.responses import JSONResponse

app = FastAPI()

@app.middleware("http")
async def add_security_headers(request, call_next):
    response = await call_next(request)
    response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
    response.headers["X-Frame-Options"] = "SAMEORIGIN"
    return response

6. 输入验证和数据清理

使用 Pydantic 模型防止 SQL 注入、XSS 等攻击。

  • 重要性: 自动验证和清理输入数据。
  • 实现方式: 定义 Pydantic 模型。
python 复制代码
from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str

@app.post("/register")
def register(user: User):
    # 注册逻辑
    pass

7. CORS 配置

限制跨域请求,防止不必要的交互。

  • 重要性: 限制跨域访问。
  • 实现方式 : 使用 CORSMiddleware 配置允许的来源、方法和头部。
python 复制代码
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://localhost:3000",
    "http://localhost:8000",
]

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

8. CSRF 保护

使用 CSRF 令牌防止跨站请求伪造攻击。

  • 重要性: 防止 CSRF 攻击。
  • 实现方式 : 使用 CSRFMiddleware 添加 CSRF 令牌保护。
python 复制代码
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

app = FastAPI()

@app.post("/submit")
def submit(request: Request):
    # 提交逻辑
    pass

注意: FastAPI 本身不提供内置的 CSRF 保护,需要使用第三方库或自行实现。

9. 速率限制

使用 fastapi-limiter 库防止滥用和 DDoS 攻击。

  • 重要性: 防止滥用。
  • 实现方式: 设置速率限制。
python 复制代码
from fastapi import FastAPI
from fastapi_limiter import FastAPILimiter
from fastapi_limiter.limit import RateLimit

app = FastAPI()

limiter = FastAPILimiter()

@app.get("/api/data")
@RateLimit(limit=10, period=60)  # 每分钟最多请求 10 次
def get_data():
    # 数据获取逻辑
    pass

limiter.init_app(app)

10. 依赖更新和管理

定期更新依赖库,防止已知漏洞利用。

  • 重要性: 保持依赖库更新。
  • 实现方式 : 使用 pip 更新依赖库。
bash 复制代码
pip install --upgrade -r requirements.txt

11. 错误处理和日志管理

实现安全的错误处理机制,避免日志中包含敏感信息。

  • 重要性: 避免泄露敏感信息。
  • 实现方式: 实现自定义错误处理。
python 复制代码
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

app = FastAPI()

@app.exception_handler(Exception)
async def handle_exception(request: Request, exc: Exception):
    return JSONResponse(status_code=500, content={"message": "Internal Server Error"})

12. RBAC(基于角色的访问控制)

限制用户访问,确保只有授权用户可以访问特定资源。

  • 重要性: 限制用户访问。
  • 实现方式: 使用依赖注入和安全作用域定义用户角色和权限。
python 复制代码
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.get("/admin")
def read_admin(token: str = Depends(oauth2_scheme)):
    # 管理员接口逻辑
    pass

通过这些配置和措施,你可以构建一个更安全的 FastAPI 应用。

相关推荐
Gogo8161 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang1 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐2 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦3 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德4 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_93594 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
小迷糊的学习记录4 小时前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
程序员敲代码吗4 小时前
面试中sessionStorage问题引发深度探讨
面试·职场和发展
程序员泠零澪回家种桔子5 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
源代码•宸6 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资