扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
FastAPI的查询白名单通过中间件实现请求过滤,其工作流程包含三个关键阶段:
安装依赖:
pip install fastapi==0.68.0 uvicorn==0.15.0 pydantic==1.10.7
基础实现代码:
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse
app = FastAPI()
TRUSTED_IPS = {"192.168.1.0/24", "10.0.0.5"}
@app.middleware("http")
async def whitelist_middleware(request: Request, call_next):
client_ip = request.client.host
if not any(client_ip in network for network in TRUSTED_IPS):
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content={"detail": "IP未授权"}
)
return await call_next(request)
@app.get("/api/data")
async def get_data():
return {"data": "敏感信息"}
查询白名单机制通过预定义允许的参数范围,有效防止非法参数注入。其核心原理如图1所示:
graph TD A[用户请求] --> B[参数解析器] B --> C{参数在白名单内?} C -->|是| D[执行正常逻辑] C -->|否| E[返回400错误]
FastAPI 通过依赖注入系统实现参数校验,结合 Pydantic 模型可构建动态白名单。以下是最新实践方案:
from fastapi import FastAPI, Query
from pydantic import BaseModel, Field
app = FastAPI()
class QueryParams(BaseModel):
category: str = Field(..., regex="^(book|movie|music)$")
sort_by: str = Field(None, regex="^(date|views|rating)$")
@app.get("/search")
async def search(params: QueryParams = Depends()):
# 实际业务逻辑
return {"status": "valid parameters"}
关键实现要素:
安全沙箱架构示意图:
graph LR A[主进程] --> B[沙箱管理器] B --> C[隔离环境1] B --> D[隔离环境2] C --> E[受限系统调用] D --> F[资源配额监控]
安装额外依赖:
pip install docker==5.0.3 pyjwt==2.3.0
安全代码执行示例:
from docker import DockerClient
from fastapi import HTTPException
docker_client = DockerClient(base_url='unix://var/run/docker.sock')
def safe_execute(code: str):
try:
container = docker_client.containers.run(
"python:3.9-slim",
["python", "-c", code],
mem_limit="100m",
network_mode="none",
read_only=True,
auto_remove=True
)
return container.logs().decode()
except Exception as e:
raise HTTPException(500, f"执行错误: {str(e)}")
参数 | 值 | 安全作用 |
---|---|---|
mem_limit | 100m | 内存使用限制 |
network_mode | none | 禁用网络访问 |
read_only | True | 文件系统只读 |
cpu_period | 100000 | CPU时间配额 |
当白名单配置为192.168.1.0/24时,下列哪个IP会被允许访问?
A) 192.168.2.5 B) 192.168.1.128 C) 10.0.0.1
答案:B。CIDR表示法/24对应子网掩码255.255.255.0
沙箱环境中设置network_mode=none的主要作用是?
A) 加速网络传输 B) 防止数据泄露 C) 降低延迟
答案:B。完全禁用容器网络访问可防止敏感数据外泄
现象:合法IP被拒绝访问
检查步骤:
解决方案:
# 添加执行超时限制
container = docker_client.containers.run(
...,
stop_timeout=30 # 30秒超时
)
预防建议:
import psutil
def check_memory():
if psutil.virtual_memory().percent > 90:
raise ResourceWarning("内存使用过高")
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:FastAPI的查询白名单和安全沙箱机制如何确保你的API坚不可摧?
参与评论
手机查看
返回顶部