扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

一、密钥轮换自动化机制

实现方案

  1. 使用环境变量存储密钥(避免硬编码)
  2. 定时任务自动生成密钥(cronjob/celery)
  3. 双密钥过渡机制(新旧密钥并存)
# 安装依赖:pip install python-jose[cryptography]==3.3.0
from jose import JWTError, jwt
from fastapi import Depends, HTTPException
import os
import secrets
from apscheduler.schedulers.background import BackgroundScheduler # 密钥管理类
class KeyManager:
def __init__(self):
self.current_key = self._generate_key()
self.previous_key = None def _generate_key(self):
return secrets.token_urlsafe(64) def rotate_key(self):
self.previous_key = self.current_key
self.current_key = self._generate_key() # 初始化密钥管理器
key_manager = KeyManager() # 定时任务(每小时轮换)
scheduler = BackgroundScheduler()
scheduler.add_job(key_manager.rotate_key, 'interval', hours=1)
scheduler.start() # JWT验证依赖
async def validate_token(token: str = Depends(oauth2_scheme)):
try:
# 尝试用当前密钥解析
payload = jwt.decode(token, key_manager.current_key, algorithms=["HS256"])
except JWTError:
try:
# 尝试用旧密钥解析(过渡期)
payload = jwt.decode(token, key_manager.previous_key, algorithms=["HS256"])
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")
return payload

二、请求频率限制防护

分层防护策略

# 安装依赖:pip install slowapi==0.1.7 redis==4.5.5
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
import redis # Redis连接(分布式环境)
redis_client = redis.Redis(host='localhost', port=6379, db=0) limiter = Limiter(
key_func=get_remote_address,
storage_uri="redis://localhost:6379/0",
strategy="fixed-window"
) app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # 全局限制:每分钟100次
@app.get("/api/public")
@limiter.limit("100/minute")
async def public_api(request: Request):
return {"data": "public"} # 严格限制:每秒2次
@app.get("/api/secure")
@limiter.limit("2/second")
async def secure_api(request: Request):
return {"data": "secure"}

三、安全头部强化配置

CSP+HSTS中间件配置

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
from fastapi.middleware.trustedhost import TrustedHostMiddleware app = FastAPI() # 强制HTTPS
app.add_middleware(HTTPSRedirectMiddleware) # 安全头部中间件
@app.middleware("http")
async def security_headers(request, call_next):
response = await call_next(request)
# 添加安全头部
response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
response.headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self' 'unsafe-inline'"
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
return response

课后Quiz

  1. 问题:当JWT验证同时需要检查新旧密钥时,代码应该如何优化?

    答案:使用密钥链验证机制,优先尝试当前密钥,失败后自动尝试历史密钥

  2. 问题:当API收到大量来自同一IP的请求时,如何快速定位异常?

    答案:通过Redis的MONITOR命令实时观察请求计数,结合日志分析请求特征


常见报错处理

错误代码 原因分析 解决方案
429 Too Many Requests 请求超出速率限制 检查limiter配置,临时提高阈值或优化业务逻辑
401 Unauthorized 密钥轮换后旧token失效 实现双密钥过渡期,强制客户端定期刷新token
500 Internal Error CSP策略过严导致资源加载失败 使用Content-Security-Policy-Report-Only模式调试策略

以上实现方案通过密钥动态管理、分层限流策略和安全头部三重防护,可有效提升FastAPI应用的安全性。实际部署时建议结合KMS服务和WAF进行深度防护。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:FastAPI安全加固:密钥轮换、限流策略与安全头部如何实现三重防护?

往期文章归档:

免费好用的热门在线工具

FastAPI安全加固:密钥轮换、限流策略与安全头部如何实现三重防护?的更多相关文章

  1. Java限流策略

    概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃.此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待.排队. ...

  2. RabbitMQ消费端限流策略(十)

    消费端限流: 什么是消费端限流? 场景: 我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么 ...

  3. 基于redis实现的四种常见的限流策略

    引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了.因为在网站运行期间可能会因为突然的访问量导致业务异常.也有可能遭受别人恶意攻击 所以我们的接口需要对流量进行限制.俗称的QPS也是对 ...

  4. 互联网进行限流策略的Semaphore信号量使用

    在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...

  5. Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输

    github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的) CQRS D ...

  6. .Net Core结合AspNetCoreRateLimit实现限流

    前言 相信使用过WebApiThrottle的童鞋对AspNetCoreRateLimit应该不陌生,AspNetCoreRateLimit是一个ASP.NET Core速率限制的解决方案,旨在控制客 ...

  7. 45.限流Throttling及源码解析

    什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...

  8. WebApiThrottle限流框架使用手册

    阅读目录: 介绍 基于IP全局限流 基于IP的端点限流 基于IP和客户端key的端点限流 IP和客户端key的白名单 IP和客户端key自定义限制频率 端点自定义限制频率 关于被拒请求的计数器 在we ...

  9. 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  10. 简易RPC框架-客户端限流配置

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

随机推荐

  1. nginx集群同步方案

    之前公司同事写过rsync加触发nginx reload脚本,适合nginx配置内容完全一致的情况. 今天写一个同步指定文件的脚本,修改完主服务器.使用scp传输到其他nginx服务器上重启NGINX ...

  2. SearXNG私有化部署与Dify集成

    一.概述 SearXNG 是一个免费的互联网元搜索引擎,它聚合了来自各种搜索服务和数据库的结果,但摆脱了隐私追踪 -- 用户行为既不会被引擎跟踪也不会被分析. 功能特性 自托管,可以私有化部署 没有用 ...

  3. 「硬核实战」回调函数到底是个啥?一文带你从原理到实战彻底掌握C/C++回调函数

    大家好,我是小康. 网上讲回调函数的文章不少,但大多浅尝辄止.缺少系统性,更别提实战场景和踩坑指南了.作为一个在生产环境中与回调函数打了多年交道的开发者,今天我想分享一些真正实用的经验,带你揭开回调函 ...

  4. Modernize DevOps

    https://www.harness.io/ Continuous Delivery and gitops: while CD automates application deployment, G ...

  5. Cursor:一个让程序员“失业”的AI代码搭子

    Tab,Tab,再来一次 Tab 在当今AI工具横飞的时代,用一款好用的AI编码工具会让你的效率成倍增长. 上篇我们刚试过国内的Trae工具写了一个简单的demo,表现的中规中矩吧.Trae可以尝试写 ...

  6. Java 21 新特性

    Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量.本文将详细介绍 Java 21 的新特性,包括基础概念.使用方法.常见实践以及最佳实践. 简介 ...

  7. pytorch 实战教程之路径聚合网络PANet(Path AggregationNetwork)代码实现 PANet原理详解

    原文作者:aircraft 原文链接:pytorch 实战教程之路径聚合网络PANet(Path AggregationNetwork)代码实现 PANet原理详解        学习YOLOv5前的 ...

  8. ElasticSearch学习文档

    中文文档:https://doc.codingdict.com/elasticsearch/ Elastic 官方网站:Free and Open Search: The Creators of El ...

  9. ModelForm验证笔记

    Form验证    UserInfoForm  --> Form -->BaseForm(is_valid...)    UserInfoModelForm -->ModelForm ...

  10. CUDA:页锁定内存(pinned memory)和按页分配内存(pageable memory )

    CUDA架构而言,主机端的内存分为两种,一种是可分页内存(pageable memroy), 一种是页锁定内存(page-lock或 pinned). 可分页内存是由操作系统API malloc()在 ...