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

在 Sanic 应用中使用内存缓存管理 IP 黑名单

[外链图片转存中…(img-Pm0K9mzd-1734859380698)]

在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能,并结合内存缓存提升性能。

1. 环境准备

首先,确保你已经安装了 Sanic 和必要的数据库驱动程序。我们将使用 aiomysql 作为 MySQL 的异步驱动。可以使用以下命令进行安装:

pip install sanic aiomysql

2. 创建数据库表

我们需要一个数据库表来存储黑名单 IP。可以使用以下 SQL 语句创建表:

CREATE TABLE api_ip_blacklist (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',ip_address VARCHAR(45) NOT NULL COMMENT '被拦截的 IP 地址,支持 IPv4 和 IPv6',status TINYINT DEFAULT 1 COMMENT '状态,1 表示有效(黑名单),0 表示无效(可用)',reason VARCHAR(255) DEFAULT NULL COMMENT '记录添加到黑名单的原因',create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间',UNIQUE KEY (ip_address) COMMENT '确保 IP 地址唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API 接口黑名单 IP 表';

3. 实现内存缓存

我们可以创建一个 CacheObject 类来管理内存中的黑名单 IP 缓存。以下是该类的实现:

class CacheObject(object):def __init__(self):self.data = dict()def put(self, key, value):"""将 IP 地址放入缓存"""self.data[key] = valuedef get(self, key):"""从缓存中获取 IP 地址的状态"""return self.data.get(key)def load_blacklist(self, ip_list):"""从数据库加载黑名单 IP 到缓存"""for ip in ip_list:self.put(ip, 1)  # 1 表示有效(黑名单)def clear(self):"""清空缓存"""self.data.clear()

4. 集成 Sanic 应用

接下来,我们将 CacheObject 集成到 Sanic 应用中,实现动态加载和检查黑名单功能。

from sanic import Sanic, response
from sanic.exceptions import Forbidden
import aiomysql
import asyncioapp = Sanic("IPBlacklistApp")# 创建 CacheObject 实例
blacklist_cache = CacheObject()# 数据库配置
DB_CONFIG = {'host': 'localhost','port': 3306,'user': 'your_username','password': 'your_password','db': 'your_database'
}async def load_blacklist():async with aiomysql.connect(**DB_CONFIG) as conn:async with conn.cursor() as cursor:await cursor.execute("SELECT ip_address FROM api_ip_blacklist WHERE status = 1")rows = await cursor.fetchall()blacklist_cache.load_blacklist([row[0] for row in rows])  # 加载黑名单到缓存async def update_blacklist():while True:await load_blacklist()await asyncio.sleep(60)  # 每60秒更新一次黑名单@app.listener('before_server_start')
async def setup_db(app, loop):await load_blacklist()  # 启动时加载黑名单到缓存app.add_task(update_blacklist())  # 定时更新黑名单@app.middleware("request")
async def block_blacklisted_ips(request):client_ip = request.ipif blacklist_cache.get(client_ip) == 1:  # 检查 IP 是否在黑名单中raise Forbidden("Your IP address is blocked.")@app.route("/")
async def index(request):return response.json({"message": "Welcome to the API!"})@app.route("/data")
async def data(request):return response.json({"data": "Here is your data!"})if __name__ == "__main__":app.run(host="0.0.0.0", port=8000)

5. 代码解析

  • 数据库连接:使用 aiomysql 连接到 MySQL 数据库并查询黑名单 IP。
  • 内存缓存:通过 CacheObject 类将黑名单 IP 缓存到内存中,提高查询效率。
  • 中间件:在请求处理中检查客户端 IP 是否在黑名单中,若在则抛出 Forbidden 异常。

6. 测试应用

启动应用后,您可以通过 Postman 或浏览器访问接口。确保数据库中有有效的黑名单 IP 数据。访问黑名单 IP 时,您将收到 403 Forbidden 响应,表示该 IP 被阻止。

7. 总结

通过结合 Sanic 框架和内存缓存,我们成功实现了一个高效的 IP 黑名单管理系统。这种方法有效地提高了查询速度,减少了对数据库的频繁访问,为 API 接口提供了更好的安全保障。

相关文章:

在 Sanic 应用中使用内存缓存管理 IP 黑名单

[外链图片转存中…(img-Pm0K9mzd-1734859380698)] 在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能&#xf…...

可翻折的CPCI导冷板卡插拔机构

本技术涉及一种cpci板卡模块拔插,尤其涉及一种可翻折的cpci导冷板卡插拔机构。 背景技术: 1、cpci(compactpci)导冷板卡是一种基于compactpci计算机总线标准的卡式电子模块,它在标准的cpci架构之上增加了导热板来提高散热能力,常…...

面试题整理9----谈谈对k8s的理解2

面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...

12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设

12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设 12 个专为城市场景设计的专业 Adobe Lightroom 预设。只需单击一下,即可通过一致、专业的基础简化您的编辑流程。 Lightroom & Lightroom Classic,桌面和移动兼容包括 12 张由 pat_kay…...

无人设备遥控器之数传功率篇

一、数传功率的基本概念 数传功率是指遥控器发射端在传输数据时所使用的功率。这个功率值直接影响了数据传输的距离和信号强度。一般来说,数传功率越大,遥控器与无人设备之间的通信距离就越远,信号强度也相应增强。 二、数传功率的调节与选择…...

灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常

1. 功耗现象 灭屏情况下,飞行模式静音模式插耳,播放音乐,电流异常 1.1测试数据 飞行模式静音模式插耳机 原生音乐播放器 DriverOnly 32.5mA User版本 45mA 1.2 电流波形现象 上述看怀疑 CPU 未进入 Deep idle 导致? 2. …...

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

🎯导读:本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则,利用负载均衡将请求转发至不同的后端服务,并集成了Token验证过滤器以确保API的安全访问,同时支持白名单路…...

Jmeter负载测试如何找到最大并发用户数?

在性能测试中,当我们接到项目任务时,很多时候我们是不知道待测接口能支持多少并发用户数的。此时,需要我们先做负载测试,通过逐步加压,来找到最大并发用户数。那么当我们找到一个区间,怎么找到具体的值呢&a…...

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式,其中集成Kafka 0.10是较为简单的,即:Kafka分区和Spark分区之间是1:1的对应关系,以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整,下面我们…...

移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ OLLVM、LLVM 与 Android NDK 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC&#xff0c…...

DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零

目录 LeetCode:1049. 最后一块石头的重量 II 基本思路 C代码 LeetCode:494. 目标和 基本思路 C代码 LeetCode:474.一和零 基本思路 C代码 LeetCode:1049. 最后一块石头的重量 II 力扣代码链接 文字讲解:LeetCode:1049. 最后一块石头的重量 II 视频讲解&…...

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法: 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装,官方地址:https://subversion.apache.org/ 2、SVN的使用…...

障碍感知 | 基于KD树的障碍物快速处理(附案例分析与ROS C++仿真)

目录 1 障碍处理与KD树2 KD树核心原理2.1 KD树的构造2.2 KD树的查找 3 仿真实现3.1 KD树基本算法3.2 ROS C仿真 1 障碍处理与KD树 在机器人感知系统中,传感器(如激光雷达、摄像头等)会采集周围的环境数据,例如代价地图、八叉树地…...

Electron -- Electron Fiddle(一)

Electron Fiddle 是一个由 Electron 团队开发的开源工具,它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面,使用户无需配置复杂的开发环境,就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...

详解Redis的常用命令

目录 KEYS 语法 EXISTS 语法 DEL 语法 EXPIRE 语法 TTL 语法 TYPE 语法 Redis数据结构和内部编码 KEYS 返回所有满⾜样式(pattern)的 key。 返回值:匹配 pattern 的所有 key。 语法 ⽀持如下统配样式: h?llo matches hello, ha…...

elasticache备份

Elasticsearch 本地快照操作流程 配置快照存储路径 在 elasticsearch.yml 文件中配置以下字段以指定数据、日志和快照存储路径:path:data: /data/data # 数据存储路径logs: /data/log # 日志存储路径repo: /data/snapshot # 快照存储路径确保路径 /dat…...

Tomcat负载均衡全解析

一、Java项目概述 (一)Java语言特点 Java是一种计算机应用语言,在开发王者和管理系统等方面有着广泛的应用。它具有开源免费的特性,不过需要注意的是,虽然语言本身开源,但是后期开发工具可能会收取费用。 (二)、JDK和Tomcat 1,JDK:作为Java语言的开发工具,在Linu…...

[LeetCode-Python版] 定长滑动窗口8——2461. 长度为 K 子数组中的最大和

题目 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。…...

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大,容错率低&am…...

预约参观华为基地,见证行业巅峰

✨ 大家好呀!今天要跟大家分享一个超酷的体验,关于华为的参观学习之旅!🚀 华为成立于1987年,位于深圳,是全球领先的信息与通信技术(ICT)解决方案供应商哦!他们专注于科技…...

go实战案例:如何在 Go-kit 和 Service Meh 中进行服务注册与发现?

今天分享的是如何在Go-kit和ServiceMesh中进行服务注册与发现的案例。在上文中,我们基于搭建好的 Consul 集群,通过 Consul 中提供的 HTTP API 实现了 register 的服务注册与发现功能。我们采用手动构造HTTP请求的方式,在服务启动时发送服务实…...

2026江门LED柔性灯带模切线路板厂家权威推荐榜单来袭

在LED照明产业蓬勃发展的当下,LED柔性灯带模切线路板作为关键组件,其市场需求日益增长。江门作为重要的产业基地,拥有众多优秀的线路板厂家,盈声电子便是其中的佼佼者。盈声电子的技术实力盈声电子掌握着环保型无导线线路板&#…...

HMC5883L地磁传感器驱动开发与AHRS融合实战

1. HMC5883L地磁传感器技术深度解析与嵌入式驱动开发实践 1.1 器件定位与工程价值 HMC5883L是由Honeywell(霍尼韦尔)推出的三轴数字地磁罗盘传感器,采用各向异性磁阻(AMR)技术,专为高精度电子罗盘、姿态检…...

flac3d台阶法开挖命令流,5.0版本,计算结果有效合理,支护方式为初衬单元与锚杆联合支护...

flac3d台阶法开挖命令流,5.0版本,计算结果有效合理,支护方式为初衬单元与锚杆联合支护,初衬采用shell单元,锚杆为cable单元,可为相关计算提供参考 直接开整吧!最近在搞隧道台阶法开挖模拟&#…...

开源社区运营:Qwen1.5-1.8B GPTQ自动回复GitHub Issues与生成Release Note

开源社区运营:用Qwen1.5-1.8B GPTQ自动回复GitHub Issues与生成Release Note 如果你在维护一个开源项目,下面这些场景你一定不陌生:每天打开GitHub,通知栏里又多了几十条未读Issues,有报Bug的,有提新功能想…...

阿里Qwen3-4B-Instruct-2507新手部署指南:从镜像到网页推理全流程

阿里Qwen3-4B-Instruct-2507新手部署指南:从镜像到网页推理全流程 1. 模型简介与核心能力 1.1 模型概述 Qwen3-4B-Instruct-2507是阿里巴巴通义实验室最新推出的轻量级文本生成大模型,属于Qwen3系列中的指令微调版本。这个40亿参数的模型在保持较低硬…...

深入C6678启动流程:从BootRom参数表到多核镜像部署的完整解析

深入解析C6678多核启动流程:从BootRom到镜像合成的工程实践 在嵌入式系统开发领域,多核DSP的启动流程设计往往是项目成败的关键环节。TMS320C6678作为TI KeyStone架构的旗舰级八核DSP处理器,其复杂的多级启动机制和灵活的部署方式&#xff0c…...

M1芯片MacOS通过Homebrew一键安装wget的完整指南

1. 为什么M1芯片的Mac用户需要wget? 作为一个在MacOS上摸爬滚打多年的开发者,我见过太多新手面对命令行工具时的茫然。wget这个看似简单的下载工具,其实是数据处理、文件抓取甚至自动化脚本中的瑞士军刀。特别是在M1芯片的Mac上,由…...

RexUniNLU中文理解能力评测:多项任务性能对比

RexUniNLU中文理解能力评测:多项任务性能对比 在自然语言处理领域,中文理解一直是个充满挑战的任务。不同于英文的空格分隔,中文的词语边界模糊、语义丰富,让很多模型在处理时感到棘手。今天我们要评测的RexUniNLU,正…...

别再为室内定位不准发愁了!用MATLAB和x-IMU,手把手教你实现ZUPT算法(附完整代码)

从零实现ZUPT算法:用MATLAB和x-IMU打造高精度室内定位系统 当你拿着手机在商场里导航,却因为GPS信号丢失而原地打转时,是否想过惯性导航可以成为救星?x-IMU这类微型惯性测量单元,配合ZUPT算法,正悄然改变着…...