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

探索数千个预构建的 AI 应用,开启你的下一个伟大创意


第一章:输入验证体系

1.1 类型安全革命

from pydantic import BaseModel, PaymentCardNumber
from pydantic.types import SecretStr class UserRequest(BaseModel):
username: str = Field(min_length=4, regex="^[a-zA-Z0-9_]+$")
credit_card: PaymentCardNumber
password: SecretStr
ip_address: IPv4Address # 自动完成:
# 1. 信用卡格式验证
# 2. 密码内存加密
# 3. IP地址合法性检测

1.2 深度校验策略

from pydantic import validator, root_validator

class OrderRequest(BaseModel):
items: list[int]
total_price: float @validator('items', each_item=True)
def check_item_ids(cls, v):
if v <= 0:
raise ValueError("非法商品ID")
return v @root_validator
def check_price_match(cls, values):
items = values.get('items')
price = values.get('total_price')
# 查询数据库验证价格一致性
real_price = calc_real_price(items)
if abs(price - real_price) > 1e-6:
raise ValueError("价格不匹配")
return values

第二章:注入攻击防护

2.1 SQL注入防护矩阵

# 危险示例(绝对禁止)
@app.get("/items")
async def get_items(name: str):
# 直接拼接SQL语句
query = f"SELECT * FROM items WHERE name = '{name}'"
return await database.fetch_all(query) # 安全方案
from sqlalchemy import text @app.get("/items")
async def safe_get_items(name: str):
# 参数化查询
query = text("SELECT * FROM items WHERE name = :name")
return await database.fetch_all(query, {"name": name})

2.2 NoSQL注入防护

from bson import json_util
from fastapi.encoders import jsonable_encoder class QuerySanitizer:
@classmethod
def sanitize(cls, query: dict):
safe_query = {}
for k, v in jsonable_encoder(query).items():
if isinstance(v, str):
safe_query[k] = {"$eq": v}
else:
safe_query[k] = v
return json_util.dumps(safe_query) # 使用示例
raw_query = {"name": {"$ne": "admin"}}
safe_query = QuerySanitizer.sanitize(raw_query) # 转换为安全查询

第三章:敏感数据处理

3.1 数据遮蔽中间件

from fastapi import Request
from fastapi.middleware import Middleware class DataMaskingMiddleware:
def __init__(self, app):
self.app = app
self.sensitive_keys = {'password', 'token', 'credit_card'} async def __call__(self, request: Request, call_next):
response = await call_next(request)
body = await response.body() # 对敏感字段进行遮蔽
masked_body = self.mask_sensitive_data(json.loads(body))
return JSONResponse(
content=masked_body,
status_code=response.status_code,
headers=dict(response.headers)
) def mask_sensitive_data(self, data):
if isinstance(data, dict):
return {k: self._mask_value(k, v) for k, v in data.items()}
return data def _mask_value(self, key, value):
if key in self.sensitive_keys:
return "***MASKED***"
return value

3.2 密码学存储方案

from cryptography.fernet import Fernet
from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
fernet = Fernet(config.SECRET_KEY) class PasswordManager:
@staticmethod
def hash_password(plain: str) -> str:
return pwd_context.hash(plain) @staticmethod
def encrypt_data(data: str) -> bytes:
return fernet.encrypt(data.encode()) @staticmethod
def decrypt_data(cipher: bytes) -> str:
return fernet.decrypt(cipher).decode() # 使用示例
hashed_pwd = PasswordManager.hash_password("user123")
encrypted_data = PasswordManager.encrypt_data("sensitive_info")

第四章:高级安全策略

4.1 请求签名验证

import hmac
from hashlib import sha256 class SignatureValidator:
@classmethod
def generate_signature(cls, data: dict, secret: str) -> str:
sorted_str = "&".join(f"{k}={v}" for k, v in sorted(data.items()))
return hmac.new(secret.encode(), sorted_str.encode(), sha256).hexdigest() @classmethod
def validate_signature(cls, data: dict, signature: str, secret: str) -> bool:
actual = cls.generate_signature(data, secret)
return hmac.compare_digest(actual, signature) # 在依赖项中进行验证
async def verify_request(
request: Request,
body: dict = Body(...),
signature: str = Header(...)
):
secret = config.API_SECRET
if not SignatureValidator.validate_signature(body, signature, secret):
raise HTTPException(403, "非法请求")
return body

4.2 速率限制防御

from fastapi import Depends
from fastapi_limiter import FastAPILimiter
from fastapi_limiter.depends import RateLimiter @app.on_event("startup")
async def startup():
await FastAPILimiter.init(config.REDIS_URL) @app.get("/sensitive", dependencies=[Depends(RateLimiter(times=5, seconds=60))])
async def sensitive_operation():
return {"detail": "敏感操作成功"}

第五章:错误处理与日志

5.1 安全错误标准化

from fastapi import HTTPException

class SecurityException(HTTPException):
def __init__(self, detail: str):
super().__init__(
status_code=403,
detail=detail,
headers={"WWW-Authenticate": "Bearer"},
) @app.exception_handler(SecurityException)
async def security_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"detail": exc.detail},
headers=exc.headers
)

5.2 安全日志审计

import logging
from logging.handlers import SysLogHandler security_logger = logging.getLogger("api.security")
security_logger.setLevel(logging.INFO)
handler = SysLogHandler(address=('logs.papertrailapp.com', 12345))
security_logger.addHandler(handler) class SecurityLogger:
@staticmethod
def log_suspicious(request: Request):
log_data = {
"ip": request.client.host,
"path": request.url.path,
"method": request.method,
"user_agent": request.headers.get("user-agent")
}
security_logger.warning("可疑请求: %s", json.dumps(log_data))

课后Quiz

Q1:哪种方式能有效防止SQL注入?

A) 使用ORM的参数化查询

B) 拼接用户输入到SQL语句

C) 用正则过滤特殊字符

D) 限制数据库权限

Q2:敏感信息遮蔽的正确时机是?

  1. 数据库存储时
  2. 日志记录时
  3. API响应时
  4. 全部正确

Q3:请求签名验证的主要作用是?

  • 提升性能
  • 防止请求篡改
  • 压缩数据体积
  • 验证请求来源合法性

错误代码速查表

错误码 场景 解决方案
422 参数校验失败 检查字段类型与格式约束
403 签名验证失败 检查请求签名生成算法
429 请求频率超限 降低操作频率或联系管理员
500 密钥配置错误 检查加密密钥加载逻辑

扩展阅读

  1. 《OWASP API Security TOP 10》 - API安全威胁权威指南
  2. 《密码学工程实践》 - 安全存储与传输的现代方案
  3. 《云原生安全架构》 - 分布式系统安全设计模式

安全箴言:真正的安全防御是分层递进的体系,而非单一技术点的堆砌。建议每月进行安全审计,每季度开展渗透测试,让安全防护与时俱进。记住:安全无小事,防御无止境。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI安全防护指南:构建坚不可摧的参数处理体系 | cmdragon's Blog

往期文章归档:

FastAPI安全防护指南:构建坚不可摧的参数处理体系的更多相关文章

  1. DDOS的攻击原理和防护指南(转)

    DDOS的攻击原理和防护指南 作者:冰盾防火墙 网站:www.bingdun.com 日期:2008-01-07   我们现在来分析DDOS的攻击原理.     首先,DDOS是英文Distribut ...

  2. 【支付专区】之微信支付构建请求参数xml

    /** * <p>Desc:weChat构建请求参数</p> * <p>参数名ASCII码从小到大排序(字典序)</p> * @param params ...

  3. CSS居中完全指南——构建CSS居中决策树

    CSS居中完全指南--构建CSS居中决策树 本文总结CSS居中,包括水平居中和垂直居中.本文相当于CSS决策树,下次再遇到CSS居中问题时有章可循. 参考Centering in CSS: A Com ...

  4. HTTPS 双向认证构建移动设备安全体系

    HTTPS 双向认证构建移动设备安全体系 对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证.这个时候我们可以使用Https的双向认证机制来实现这个功能. 单向认证:保证server是 ...

  5. 以代码为剑、数学为犁,SPC构建NGK算力生态体系

    人类创造工具,工具反过来也改变着人类.以区块链为核心的货币革命率先吹响了对金融世界重塑的号角.以代码为剑.数学为犁,区块链构建了新的网路信任体系,这是一切的开始.基于此,NGK区块链技术将赋能实体产业 ...

  6. 基础才是重中之重~Emit动态构建方法(参数和返回值)

    回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...

  7. JS批量获取参数构建JSON参数对象

    在做系统的时候,往往查询条件是被严格指定的,大量的查询条件,一两个页面还可以通过dom去一个一个获取,再构建参数对象,请求后台接口. 这里给大家讲一个批量获取前端参数,构建参数对象. <form ...

  8. 利用DetachedCriteria构建HQL参数动态匹配

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 1. DetachedCriteria构建类:CriteriaBuilder.java package com.ims.pe ...

  9. DDOS的攻击原理和防护指南

    我们现在来分析DDOS的攻击原理. 首先,DDOS是英文Distributed Denial of Service的缩写,意思是分布式拒绝服务.拒绝服务又是什么意思呢?就是采取一些垃圾数据包来阻塞网站 ...

  10. dapper利用DynamicParameters构建动态参数查询

    public static int GetTotalLogin(string username,DateTime start, DateTime end) { using (var _connecti ...

随机推荐

  1. RestTemplate HttpClient详解及如何设置忽略SSL

    @Configuration public class ScheduleRestConfigurer { @Bean public RestTemplate restTemplate() { Rest ...

  2. [转]Node.js安装详细步骤教程(Windows版)

    什么是Node.js? 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境: Node.js使用 ...

  3. Intellij IDEA部署Web项目到tomcat时提示:Error:Cannot build Artifact ':war exploded' because it is included into a circul

    在Idea中使用Maven创建父子工程,第一个Model的那个项目可以很好的运行,在创建一个Model运行时报这个错.原因是tomcat部署了多个Web项目,可能最开始是两个项目的配置文件混用用,最后 ...

  4. C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”的解决办法

    现象描述: C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult ...

  5. FreeSWITCH日志功能分析及apr模拟

    操作系统版本:Debian 12.5_x64 FreeSWITCH版本: 1.10.11 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc版本: 12.2.0   日 ...

  6. 基于 Admission Webhook 实现 Pod DNSConfig 自动注入

    本文主要分享如何使用 基于 Admission Webhook 实现自动修改 Pod DNSConfig,使其优先使用 NodeLocalDNS . 1.背景 上一篇部署好 NodeLocal DNS ...

  7. linux网桥(Linux Bridge)的一些个人记录

    目录 1. Linux Bridge简述 2. 网桥创建 创建 配置持久化 在Debian/Ubuntu系统上: 在CentOS/RHEL系统上: 启用和验证 3. 关于linux网桥不转发ip帧的问 ...

  8. C#钩子(Hook) 捕获键盘鼠标所有事件 - 5分钟没有操作,自动关闭 Form 窗体

    C# 钩子 捕获键盘鼠标所有事件,可用于:判断鼠标键盘无操作时,关闭 Winform 窗体 5分钟没有操作,自动关闭 Form 窗体 钩子(Hook)的作用主要体现在监视和拦截系统或进程中的各种事件消 ...

  9. RPC简介及框架选择-copy

    简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点.常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式 ...

  10. 第一二章(Nginx+Lua)开发环境

    第一章 安装OpenResty(Nginx+Lua)开发环境 首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作 ...