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防护:
- CSRF Token
- 服务端生成唯一 Token,写入表单中;
- 请求时必须携带 Token,攻击者无法伪造。
- SameSite Cookie 策略
- SameSite=Strict/Lax 防止第三方请求自动携带 Cookie。
- 双重验证 Referer 或 Origin 头
- 拒绝非本站域名发起的表单请求。
- 使用 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"}