扫描二维码

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

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

1. FastAPI安全基础架构

通过内置的OAuth2和JWT支持,FastAPI提供了开箱即用的安全解决方案。典型的认证流程如下:

graph TD
A[用户请求] --> B[认证中间件]
B --> C{凭证验证}
C -->|通过| D[颁发访问令牌]
C -->|失败| E[返回401错误]
D --> F[携带令牌访问资源]
F --> G[权限验证]
G -->|授权| H[返回数据]
G -->|拒绝| I[返回403错误]

JWT 认证流程

from fastapi import Depends, HTTPException
from jose import JWTError, jwt
from passlib.context import CryptContext # 配置参数
SECRET_KEY = "your-secret-key-here"
ALGORITHM = "HS256"
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password) def create_access_token(data: dict):
return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM) async def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
return payload.get("sub")
except JWTError:
raise HTTPException(status_code=401, detail="Invalid credentials")

(安装要求:python-jose[cryptography]3.3.0 passlib1.7.4)

OAuth2 密码流

使用依赖注入系统实现权限层级:

from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

class RoleChecker:
def __init__(self, allowed_roles: List[str]):
self.allowed_roles = allowed_roles def __call__(self, user: User = Depends(get_current_user)):
if user.role not in self.allowed_roles:
raise HTTPException(403, "Operation forbidden")

OWASP Top5防御实现

漏洞对应表

OWASP 风险项 FastAPI 防护措施
注入攻击 Pydantic 数据验证 + ORM 参数化查询
失效的身份认证 JWT 签名验证 + 密码哈希存储
敏感数据泄露 自动生成的API文档过滤敏感字段
XML 外部实体 默认禁用XML解析器
失效的访问控制 基于角色的权限依赖注入系统

以SQL注入防护为例的代码实现:

# 安装依赖:fastapi==0.68.0 pydantic==1.10.7 sqlalchemy==1.4.36
from fastapi import Depends
from pydantic import BaseModel
from sqlalchemy import text class QueryParams(BaseModel):
product_id: int @app.get("/products/")
async def get_products(
params: QueryParams = Depends(),
db: Session = Depends(get_db)
):
# 使用参数化查询防御SQL注入
result = db.execute(
text("SELECT * FROM products WHERE id = :product_id"),
{"product_id": params.product_id}
)
return result.fetchall()

3. 自动化安全工具链配置

工具链集成方案:

# security_pipeline.yml
stages:
- test
- scan bandit:
stage: test
script:
- pip install bandit==1.7.4
- bandit -r ./app dependency-check:
stage: scan
script:
- wget https://jeremylong.github.io/DependencyCheck/dependency-check-7.1.1-release.zip
- ./dependency-check.sh --project "MyAPI" --scan ./src

扫描工具组合

# 代码审计
bandit -r ./ --severity-level high # 依赖检查
safety check --full-report # 容器扫描
trivy image --severity CRITICAL my-api:latest

CI/CD 集成示例

steps:
- name: Security Scan
run: |
bandit -r ./ --format json --output bandit.json
safety check --json > safety.json
trivy fs --severity HIGH,CRITICAL . > trivy.txt

4. 应急响应处理机制

应急流程图

graph TD
A[监控系统告警] --> B{确认攻击类型}
B -->|注入攻击| C[立即隔离实例]
B -->|凭证泄露| D[强制密码重置]
C --> E[分析日志溯源]
D --> F[撤销相关令牌]

日志配置示例

import logging
from fastapi import Request @app.middleware("http")
async def log_requests(request: Request, call_next):
logger.info(f"Request: {request.method} {request.url}")
response = await call_next(request)
logger.info(f"Response: {response.status_code}")
return response

典型的安全事件处理流程:

graph LR
A[事件检测] --> B[初步评估]
B --> C{严重等级}
C -->|高危| D[启动应急小组]
C -->|中危| E[限时修复]
C -->|低危| F[常规处理]
D --> G[系统隔离]
G --> H[漏洞分析]
H --> I[修复验证]
I --> J[系统恢复]

课后Quiz:

Q: 当API返回422 Validation Error时,首要检查点是什么?

A: 应检查请求体是否符合Pydantic模型定义,特别是数据类型和必填字段。使用curl命令重放请求时添加-v参数查看原始请求数据。

当收到 JWTExpiredError 时应如何处理?

  • A) 忽略错误继续操作
  • B) 强制用户重新登录
  • C) 自动延长令牌有效期

答案:B。根据安全最佳实践,令牌过期后必须通过正规认证流程重新获取,不能自动续期以防止会话劫持。

常见报错处理:

问题:JWT验证失败返回403

解决方案:

  1. 检查令牌有效期(exp字段)
  2. 验证签名算法是否匹配
  3. 确认令牌携带方式正确(Authorization: Bearer模式)
  4. 调试模式开启时禁用生产环境证书

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

,阅读完整的文章:FastAPI如何玩转安全防护,让黑客望而却步?

往期文章归档:

免费好用的热门在线工具

FastAPI如何玩转安全防护,让黑客望而却步?的更多相关文章

  1. WEB安全新玩法 [3] 防护交易数据篡改

    在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...

  2. WEB安全新玩法 [4] 防护邮箱密码重置漏洞

    大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置.这一过程容易因设 ...

  3. 应对WannaCry勒索危机之关闭445端口等危险端口——以本人Windows7系统为例

    应对WannaCry勒索危机之关闭445端口等危险端口--以本人Windows7系统为例 近日,全球范围内爆发WannaCry勒索病毒危机 我国很多大学纷纷中招.受灾严重,甚至连刘老师的电脑也-- 拿 ...

  4. 浅析AnyCast网络技术

    什么是BGP AnyCast? BGP anycast就是利用一个(多个) as号码在不同的地区广播相同的一个ip段.利用bgp的寻路原则,短的as path 会选成最优路径(bgp寻路原则之n),从 ...

  5. 图片后门恶意捆绑工具FackImageexploer

    本文作者:夜莺 今天向大家提个醒,最近有一款工具名叫FackImageexploer,该工具能够将恶意的.bat和.exe程序与图片绑定在一起,假若受害者点击了图片,就会反弹个shell给不法分子,如 ...

  6. Tomcat的配置文件Server.xml解析

    配置元素说明: 元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat 的请求 shutdown 指定向端口发送的命令字符串 service name 指定serv ...

  7. 系列文章(一):探究电信诈骗的关键问题与应对策略——By Me

    导读:伴随着互联网与移动网的融合,移动互联网变得更加开放.与此同时,伴随着新型的移动互联网服务模式的出现,移动互联网的安全问题也出现了新的形式及特点. 如今,移动互联网遭受到的攻击已严重影响了人们的隐 ...

  8. Tomcat配置和Spring MVC配置

    Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME.然后找这个变量所指的目录下的conf文件夹,从中读取配置文件.最重要的配置文件:server.xm ...

  9. 网站开发学习Python实现-Django学习-自学注意(6.1.3)

    @ 目录 1.配置文件相关 2.应用创建相关 3.项目相关 4.模板相关 5.其他 关于作者 1.配置文件相关 1.可以更改时间,地区相关(国际化) 2.BASE_DIR很重要,一个工程要有很好的移植 ...

  10. 700名黑客无法攻破Trillium安全防护软件 欲以网络安全险获利

    盖世汽车讯 据外媒报道,在2017 DEF CON黑客大会上,黑客们受邀入侵Car Hacking Village会场内的各类自动驾驶车辆.物联网网络安全公司--Trillium Incorporat ...

随机推荐

  1. study Python3【3】的函数

    Python的函数定义简单,但灵活度非常大.功能强大意味复杂.为了复习,把廖雪峰老师的该课程做个回顾. 参数有:必选参数.默认参数.可变参数.关键字参数.命名关键字参数. 计算x的n次方函数: def ...

  2. 使用 AutoGen Studio 打造你的私有团队

    AI Agent 无疑是今年最火爆的概念,从科技巨头的战略布局到创业公司的创新产品,AI 智能体正在重塑我们与机器交互的方式.无论是自动化任务.个性化服务,还是复杂问题的协同解决,AI Agent 都 ...

  3. Python科学计算系列1—方程和方程组

    1.一元方程求解 例1:求下列一元二次方程的解 代码如下: # 定义数学符号 from sympy import symbols, solve x = symbols('x') f = x ** 2 ...

  4. 通过phpstudy设置域名/直接修改Apache、nginx配置后域名不生效的问题

    使用虚拟主机或则云服务器的新萌可能会遇到这样的的问题,通过phpstudy解析域名或者直接修改Apache.nginx配置后域名并没有生效,一遍遍的检测配置文件,没毛病啊-(随便说下:Apache是h ...

  5. P7404题解

    分析题意: 题意就是让前半段序列呈上升趋势,后半段呈下降趋势. 解题方法: 考虑差分出序列的高度. xix_ixi​ 表示以 iii 为 kkk 的前半段需增加量. yiy_iyi​ 表示以 i−1i ...

  6. ESP32教程:通过WIFI控制LED灯的开关

    LED闪烁 在通过WIFI控制LED灯的开关之前,我们先实现一下LED闪烁. 接线图: 来源:https://esp32io.com/tutorials/esp32-led-blink 我的接线图: ...

  7. STM32操作GPIO外设(点亮LED灯)的两种方式——使用官方库函数或直接操作寄存器

    STM32操作外设(点亮LED灯)的两种方式 准备工作: 硬件gec6818开发板.搭载stm32f407zet6芯片 keil项目模板,准备好官方库函数 官方提供的<STM32f407数据手册 ...

  8. chatGPT:清理 master 分支的文件,并让这个分支只有一个提交

    Q 我的开发工作都在 master 分支上做的,master 分支有很多的开发的时候产生的临时文件.我想清空 master 分支的历史记录.并且只保留 README.md 和 main.py A 你可 ...

  9. java处理http请求之Apache httpClient入门教程

    说明 本文示例代码基于 4.5.13 版本 转载请注明出处:https://www.cnblogs.com/qnlcy/p/15378446.html 一.项目介绍 Apache 提供用来做http请 ...

  10. ASP.NET Core之由配置系统与创建app所想到的

    先看文件配置的代码: ConfigurationBuilder configBuilder=new ConfigurationBuiler();//典型的创建者模式 configBuilder.Add ...