扫描二维码

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

发现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. HBase集群快速部署摘要

    HBase快速部署摘要 相关软件版本 系统:CentOS-7-1810 JDK:7u79 Hadoop:2.7.2 ZooKeeper:3.4.10 HBase:1.3.3 静态IP 位置 vi /e ...

  2. KGDB调试Linux内核与模块

    前言 内核 5.10 版本 openEuler 使用 yum install 下载了源码,并且通过两个 VMware 虚拟机进行调试 ubuntu 直接使用 git 拉取了https://kernel ...

  3. 请求参数的绑定(获取请求数据)、请求参数是一个POJO

    一. @Controller @RequestMapping("/parem") public class ParamController { /** * springmvc接受请 ...

  4. 🎀chrome扩展程序本地打包

    简介 本文为Chrome浏览器已安装的扩展程序打包为离线.crx文件,便于在无法访问Chrome商店场景下使用 扩展管理页面 chrome://extensions/ 确定自己需要打包的扩展程序ID ...

  5. Tortoise-ORM与FastAPI集成:异步模型定义与实践

    title: Tortoise-ORM与FastAPI集成:异步模型定义与实践 date: 2025/04/20 11:38:23 updated: 2025/04/20 11:38:23 autho ...

  6. php/symfony执行生成密钥命令时报错Undefined constant 'OPENSSL_KEYTYPE_RSA'解决办法

    php/symfony执行 lexik:jwt:generate-keypair --overwrite命令生成密钥时报错Undefined constant 'OPENSSL_KEYTYPE_RSA ...

  7. layui动态渲染select表单、初始化默认值、change事件监听等

    layui动态渲染,初始化默认值 var html = ''; html += '<select name="" lay-search lay-verify="re ...

  8. asp.net里cookie、session进一步理解

    参照: session+cookie简单讲解以及持久化登录实现_session实现用户登录_AkagiSenpai的博客-CSDN博客 sessionID和cookie - 哈哈呵h - 博客园 (c ...

  9. Java---实现文件拷贝

    直接上代码: package com.zjw.file; import java.io.BufferedInputStream; import java.io.BufferedOutputStream ...

  10. windows查看连接过wifi的密码

    如何使用批处理脚本获取已保存的WiFi密码 在日常使用电脑时,我们经常会连接多个WiFi网络.随着时间的推移,可能会忘记某些WiFi的密码.幸运的是,Windows系统提供了命令行工具netsh,可以 ...