当前位置: 首页 > news >正文

FastAPI系列13:API的安全防护

API的安全防护

    • 1、HTTPS 强制
      • 什么是HTTPS强制
      • 如何在FastAPI中实现HTTPS强制
    • 2、CORS跨域资源共享
      • 什么是CORS
      • 在 FastAPI 中开启 CORS
    • 3、SQL注入防护
      • 什么是SQL注入
      • 如何在FastAPI中实现SQL注入防护
    • 4、CSRF防护
      • 什么是CSRF防护
      • 如何在FastAPI中实现CSRF防护

在 FastAPI系列12:使用JWT 登录认证和RBAC 权限控制 一节中,我们介绍了在FastAPI中实现身份验证和授权这两个API 安全防护的两个基本要素。本节我们继续讨论HTTPS 强制、 CSRF防护、CORS跨域资源共享、 SQL注入防护等内容。

1、HTTPS 强制

什么是HTTPS强制

HTTPS协议在 HTTP 的基础上添加了 SSL/TLS 加密层,在HTTPS协议下所有数据传输都经过对称加密(如 AES),即使被窃听也无法读取内容。而HTTPS 强制是指确保用户始终通过HTTPS安全连接访问网站,防止:

  • 数据在传输过程中被窃听或篡改(中间人攻击);
  • 用户意外使用不安全的 http:// 访问。

如何在FastAPI中实现HTTPS强制

一般情况下,我们可以通过通过反向代理(如 Nginx)实现强制跳转,如:

server {listen 80;server_name yourdomain.com;return 301 https://$host$request_uri;
}

在FastAPI中,也可以使用中间件自动重定向到 HTTPS

from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponseapp = FastAPI()@app.middleware("http")
async def redirect_to_https(request: Request, call_next):if request.url.scheme == "http":url = request.url.replace(scheme="https")return RedirectResponse(url=str(url))return await call_next(request)

2、CORS跨域资源共享

什么是CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享) 是浏览器的一种安全机制,用于允许或阻止网页在一个域名下的前端 JavaScript 向另一个域名的服务器发送请求。浏览器默认实行 同源策略:前端只能访问与自己同源(协议 + 域名 + 端口)的接口,以防止恶意网站窃取用户数据。
而CORS 允许服务器明确声明:“哪些源可以访问我”

在 FastAPI 中开启 CORS

from fastapi.middleware.cors import CORSMiddlewareapp.add_middleware(CORSMiddleware,allow_origins=["https://example.com"],  # 或 ["*"] 允许所有allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)

3、SQL注入防护

什么是SQL注入

SQL 注入(SQL Injection) 是一种严重的安全漏洞,攻击者通过向应用程序的输入字段注入恶意 SQL 代码,使服务器执行非预期的数据库操作。
一般情况下,我们可以通过以下方法来防护SQL注入:

  • 使用 参数化查询 / 预编译语句(prepared statements)
  • 严格 输入校验白名单过滤
  • 使用 ORM(如 SQLAlchemy、Django ORM)
  • 最小化数据库权限(只授予必要操作)

如何在FastAPI中实现SQL注入防护

使用数据库驱动的参数化查询(原生 SQL)

cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

使用 ORM(如 SQLAlchemy / Tortoise ORM)

from sqlalchemy import select
from models import Userstmt = select(User).where(User.username == username_input)
result = db.execute(stmt)  # 安全:ORM 会自动参数化

4、CSRF防护

什么是CSRF防护

CSRF(跨站请求伪造)防护是一种防止攻击者利用受害者登录状态,冒充用户向目标网站发送恶意请求的安全机制。
通常我们可以通过以下方式进行CSRF防护:

  1. CSRF Token
    • 服务端生成唯一 Token,写入表单中;
    • 请求时必须携带 Token,攻击者无法伪造。
  2. SameSite Cookie 策略
    • SameSite=Strict/Lax 防止第三方请求自动携带 Cookie。
  3. 双重验证 Referer 或 Origin 头
    • 拒绝非本站域名发起的表单请求。
  4. 使用 JWT + 不自动携带 Token 的存储方式(如 LocalStorage)

如何在FastAPI中实现CSRF防护

一般情况下,我们可以启用 SameSite Cookie 策略:

from fastapi.responses import Response
response.set_cookie(key="session", value=session_id,httponly=True,samesite="Strict",  # 或 "Lax"secure=True
)

可以使用CSRF Token 中间件,配合 starlette-wtf 或 itsdangerous 手动生成和验证 Token:

from itsdangerous import URLSafeTimedSerializer
from fastapi import FastAPI, Request, Form, HTTPExceptionapp = FastAPI()
serializer = URLSafeTimedSerializer("secret-key")@app.get("/form")
def get_form():token = serializer.dumps("csrf-token")return f'<form action="/submit" method="post"><input name="csrf_token" value="{token}"><button>Submit</button></form>'@app.post("/submit")
def submit_form(csrf_token: str = Form(...)):try:serializer.loads(csrf_token, max_age=3600)except Exception:raise HTTPException(status_code=403, detail="Invalid CSRF Token")return {"message": "Form submitted successfully"}
http://www.xdnf.cn/news/271585.html

相关文章:

  • 经典算法 最小生成树(prim算法)
  • QT6 源(70):阅读与注释按钮类 QPushButton,及各种属性验证,
  • 返回倒数第k个节点题解
  • 学习黑客分析案例
  • 山东大学计算机组成与设计第九、十章习题解析
  • 延时启动windows中程序
  • C++Primerplus编程练习 第五章
  • 继V1.5之后,幻方又发布了 DeepSeek-Prover-V2-671B,参数提升100倍
  • 【AI平台】n8n入门6:调用MCP服务(非社区节点)
  • 构建灵活的配置管理系统:YAML 与 TOML 的应用与热更新实践
  • 生成树、Prime、Kruskal
  • 第40课 常用快捷操作——按“Tab键”即时更改属性
  • 为什么需要启动探针(StartupProb)?
  • neatchat轻量级丝滑的ai模型web客户端
  • python进阶(2)二进制
  • 文件操作-
  • 【今日三题】游游的重组偶数(模拟) / 体操队形(回溯) / 二叉树中的最大路径和(树形dp)
  • 注入内部Bean
  • C与指针5——字符串合集
  • 高频数据冲击数据库的技术解析与应对方案
  • 基于构件的软件开发方法及其应用
  • Linux系统如何完成系统周期化任务
  • 什么是 Redis?
  • 定长滑动窗口(基础)
  • 【Mytais系列】核心工作流程
  • C++类_移动构造函数
  • <init-param>和<load-on-startup>的作用
  • 重新构想E-E-A-T:提升销售与搜索可见性的SEO策略
  • 如何优化MySQL主从复制的性能?
  • 【电路笔记】-自耦变压器