You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅允许指定应用访问FastAPI接口,避免接口被恶意滥用?

FastAPI接口限制仅自有开源应用可调用的实现方案

首先需要注意:由于你的应用是开源的,禁止将通用访问凭证硬编码到开源客户端代码中,否则所有部署这套服务的用户都会面临接口被恶意调用的风险,建议默认让用户自行部署后端服务,私有配置自己的访问凭证。

下面分不同安全等级给出可落地的方案:

1. 基础级:API Key校验

实现成本最低,适合小流量个人使用场景:

  • 服务端生成一串无规律的强密钥,保存在服务端的环境变量或私有配置文件中,不要提交到开源仓库
  • 客户端提供配置页,让用户自行填入自己部署服务端时设置的密钥,请求接口时将密钥放在X-API-Key请求头中传输
  • FastAPI侧通过依赖项统一校验所有业务接口的请求头密钥,校验失败直接返回403

示例代码:

from fastapi import FastAPI, HTTPException, Header, Depends
import os

app = FastAPI()
# 生产环境从环境变量读取密钥,不要硬编码
VALID_API_KEY = os.getenv("FASTAPI_VALID_API_KEY", "默认仅供测试的强密钥")

async def verify_api_key(x_api_key: str = Header(None)):
    if not x_api_key or x_api_key != VALID_API_KEY:
        raise HTTPException(status_code=403, detail="非法访问")

# 所有需要保护的接口都添加这个依赖
@app.post("/your-business-api", dependencies=[Depends(verify_api_key)])
async def your_api():
    return {"status": "success"}

2. 进阶级:请求签名校验

可以防抓包篡改、防重放攻击,适合公开网络使用场景:

  • 客户端和服务端约定统一的签名规则:将请求参数、当前时间戳、用户自定义的签名盐拼接后,做SHA256哈希得到签名值
  • 客户端发起请求时,将时间戳、签名值一起放到请求头中传给服务端
  • 服务端收到请求后,用相同规则重新计算签名,和客户端传的签名做比对,同时校验时间戳和服务器当前时间差不超过5分钟,不符合要求直接拦截

3. 系统级:用户身份鉴权

适合多用户、多权限的复杂场景:

  • 新增用户注册、登录接口,用户登录验证通过后,返回有效期可控的JWT访问令牌
  • 后续所有业务接口都要求请求头携带JWT,服务端校验JWT的合法性、有效期、权限范围后才放行请求
  • 可以基于用户ID或IP配置接口调用频率阈值,超出阈值直接限制访问,避免被刷接口

额外通用防护措施

  • 配置CORS跨域规则,仅允许你的应用对应的域名或本地源发起请求,直接拦截其他来源的跨域请求
  • 接入接口限流:使用slowapi等库设置全局、单IP、单用户的请求频率上限,超出阈值返回429错误
  • 生产环境用Nginx做反向代理,在Nginx层提前做IP白名单、恶意特征拦截、流量清洗,降低FastAPI的服务压力

内容的提问来源于stack exchange,提问作者VG08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:04