尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【基于 Swoole+Hyperf 的微服务实战】第十二周·周四:安全模块:IP 黑白名单、SQL 注入/XSS 检测插件、请求体大小限制
【基于 SwooleHyperf 的微服务实战】第十二周·周四安全模块IP 黑白名单、SQL 注入/XSS 检测插件、请求体大小限制今天我们进入第十二周周四主题是安全模块IP 黑白名单、SQL 注入/XSS 检测插件、请求体大小限制。在前面几天我们为网关添加了动态路由和插件链、JWT 鉴权、分布式限流今天我们要为网关注入安全灵魂——一套多层防护机制让恶意请求在进入后端之前就被识别和阻断保护内部服务免受攻击。今日目标理解网关安全防护的常见维度网络层IP、协议层Body 大小、应用层注入攻击。实现IP 黑白名单插件支持从 Nacos 动态加载规则对命中黑名单的 IP 直接返回 403。编写SQL 注入/XSS 检测插件基于正则表达式或安全库检查请求参数、头、Body拦截恶意内容。添加请求体大小限制中间件防止超大 Body 攻击在网关入口处拒绝超出限制的请求。验证各安全插件独立工作和协同工作的能力并进行简单的攻击模拟如构造注入 payload确认防御有效。一、环境准备约 20 分钟继续在gateway-plus项目中开发确保 Redis、Nacos 服务可用。docker-composeexecswoolebashcd/var/www/gateway-plus今天不需要额外安装组件使用已有的 Redis、Guzzle、事件机制即可。SQL/XSS 检测如果需要更精准的库可以引入voku/anti-xss和简单的 SQL 注入正则但我们今天采用基于正则表达式的轻量方案满足大多数场景。二、知识核心网关安全防护层次约 1 小时1. 为什么在网关做安全防护统一防护避免在每个后端服务重复实现安全逻辑。早期拦截恶意流量在入口就被丢弃减少后端压力。动态配置IP 黑名单、规则可以实时更新无需重启服务。审计与告警在网关记录攻击事件配合监控系统即时告警。2. IP 黑白名单黑名单已知的恶意 IP、爬虫 IP 直接拒绝。白名单仅允许内网或合作伙伴 IP 访问管理接口。动态管理可通过管理后台或 API 添加/移除存储在 Redis 或 Nacos。我们实现一个插件IpFilterPlugin在 Nacos 配置中定义列表{ip_filter:{mode:blacklist,// blacklist 或 whitelistlist:[192.168.1.100,10.0.0.0/8]}}支持单个 IP 和 CIDR 网段需要计算子网掩码。3. SQL 注入与 XSS 检测SQL 注入检测常见的注入关键词UNION,SELECT,1 OR 11、特殊字符,;,--。严格场景下可以对所有输入进行参数化处理但网关层面通常采用正则拦截。XSS跨站脚本检测script、javascript:、onerror等标签和事件处理器。我们将创建一个InjectionFilterPlugin对请求的Query 参数、Body、Headers可选择进行扫描匹配正则即返回 400。4. 请求体大小限制防止客户端发送巨大请求体如几 MB 的 JSON占用网关内存和带宽。Swoole 的 HTTP 服务器支持package_max_length配置但为了灵活性我们可以在中间件中检查Content-Length头若超过阈值如 1MB则直接返回 413 Payload Too Large。这个功能可以作为一个简单的全局中间件而非插件因为它是网络层的保护。三、实战编写三个安全插件约 2.5 小时步骤 1IP 过滤插件创建app/Plugin/IpFilterPlugin.php?phpnamespaceApp\Plugin;useApp\Plugin\Annotation\Plugin;useHyperf\Contract\ConfigInterface;useHyperf\Di\Annotation\Inject;usePsr\Http\Message\ServerRequestInterface;usePsr\Http\Message\ResponseInterface;#[Plugin(name:ip-filter,priority:5)]// 最早执行classIpFilterPluginimplementsPluginInterface{#[Inject]privateConfigInterface$config;publicfunctionhandle(ServerRequestInterface$request,callable$next):ResponseInterface{$ip$this-getClientIp($request);$filter$this-config-get(ip_filter,[]);$mode$filter[mode]??blacklist;$list$filter[list]??[];$matchedfalse;foreach($listas$entry){if($this-matchIp($ip,$entry)){$matchedtrue;break;}}if(($modeblacklist$matched)||($modewhitelist!$matched)){return$this-forbidden(IP{$ip}is blocked);}return$next($request);}privatefunctionmatchIp(string$ip,string$entry):bool{// 支持 CIDRif(str_contains($entry,/)){[$subnet,$bits]explode(/,$entry);$bits(int)$bits;$ipLongip2long($ip);$subnetLongip2long($subnet);$mask-1(32-$bits);return($ipLong$mask)($subnetLong$mask);}return$ip$entry;}privatefunctiongetClientIp(ServerRequestInterface$request):string{$params$request-getServerParams();return$params[remote_addr]??127.0.0.1;}privatefunctionforbidden(string$msg):ResponseInterface{return\Hyperf\Utils\ApplicationContext::getContainer()-get(\Hyperf\HttpServer\Contract\ResponseInterface::class)-json([code403,message$msg])-withStatus(403);}publicfunctiongetName():string{returnip-filter;}publicfunctiongetPriority():int{return5;}}配置位置在 Nacos 的gateway-routesJSON 中增加ip_filter节点或单独一个data_id。我们统一放在gateway-routes中因为都属于网关运行时配置。示例配置ip_filter:{mode:blacklist,list:[192.168.1.100]}步骤 2SQL 注入 / XSS 检测插件创建app/Plugin/InjectionFilterPlugin.php?phpnamespaceApp\Plugin;useApp\Plugin\Annotation\Plugin;usePsr\Http\Message\ServerRequestInterface;usePsr\Http\Message\ResponseInterface;#[Plugin(name:injection-filter,priority:8)]classInjectionFilterPluginimplementsPluginInterface{// SQL 注入常见模式privatearray$sqlPatterns[/\bUNION\sSELECT\b/i,/\bSELECT\b.*\bFROM\b/i,/\bOR\b\s\1\\1/i,/\bDROP\b\s\bTABLE\b/i,/\bINSERT\b\s\bINTO\b/i,/--$/m,/;\s*$/m,/(\%27)|(\)|(\-\-)|(\%23)|(#)/i,// 特殊字符];// XSS 常见模式privatearray$xssPatterns[/script\b[^]*(.*?)\/script/is,/on\w\s*\s*[^]*/i,/\bjavascript:\s*/i,/img[^]src\s*\s*[^]onerror\s*/i,];publicfunctionhandle(ServerRequestInterface$request,callable$next):ResponseInterface{// 检查 Query 参数$query$request-getUri()-getQuery();if($this-containsInjection($query)){return$this-badRequest(Malicious query detected);}// 检查 Body$body(string)$request-getBody();if($this-containsInjection($body)){return$this-badRequest(Malicious body detected);}// 可选检查特定 Header如 Referer, User-Agent但通常不检查// ...return$next($request);}privatefunctioncontainsInjection(string$content):bool{if(empty($content))returnfalse;foreach(array_merge($this-sqlPatterns,$this-xssPatterns)as$pattern){if(preg_match($pattern,$content)){returntrue;}}returnfalse;}privatefunctionbadRequest(string$msg):ResponseInterface{return\Hyperf\Utils\ApplicationContext::getContainer()-get(\Hyperf\HttpServer\Contract\ResponseInterface::class)-json([code400,message$msg])-withStatus(400);}publicfunctiongetName():string{returninjection-filter;}publicfunctiongetPriority():int{return8;}}步骤 3请求体大小限制中间件这不是插件而是全局中间件因为它在请求解析阶段就需要工作。Hyperf 的 HTTP 服务器可以配置settings中的package_max_length但该值作用于整个服务无法动态调整。我们可以在中间件中获取Content-Length头与配置的阈值比较。创建app/Middleware/BodySizeLimitMiddleware.php?phpnamespaceApp\Middleware;useHyperf\Contract\ConfigInterface;useHyperf\Di\Annotation\Inject;usePsr\Http\Message\ResponseInterface;usePsr\Http\Message\ServerRequestInterface;usePsr\Http\Server\MiddlewareInterface;usePsr\Http\Server\RequestHandlerInterface;classBodySizeLimitMiddlewareimplementsMiddlewareInterface{#[Inject]privateConfigInterface$config;publicfunctionprocess(ServerRequestInterface$request,RequestHandlerInterface$handler):ResponseInterface{$maxSize(int)$this-config-get(body_size_limit,1048576);// 默认 1MB$contentLength(int)($request-getHeaderLine(Content-Length)??0);if($contentLength$maxSize){return\Hyperf\Utils\ApplicationContext::getContainer()-get(\Hyperf\HttpServer\Contract\ResponseInterface::class)-json([code413,messagePayload Too Large])-withStatus(413);}return$handler-handle($request);}}将该中间件注册到全局中间件列表最前面// config/autoload/middlewares.phphttp[\App\Middleware\BodySizeLimitMiddleware::class,\App\Middleware\GatewayCoreMiddleware::class,],配置在 Nacos 中增加body_size_limit字段如body_size_limit: 1048576。步骤 4更新 Nacos 配置并注册插件在 Nacos 的gateway-routesJSON 中添加安全相关配置和插件定义{body_size_limit:1048576,ip_filter:{mode:blacklist,list:[192.168.1.100]},injection_patterns:{...},// 可选自定义正则routes:[{id:api,priority:100,predicates:{path:/api/**},target:{base_url:http://hyperf-app:9501},plugins:[ip-filter,jwt-auth,injection-filter,rate-limiter,request-log]}]}注意插件顺序IP 过滤优先 5→ 鉴权10→ 注入检测8→ 限流20→ 日志-100。虽然注入检测优先级8会在鉴权前执行这是合理的因为恶意流量应该在鉴权前就丢弃避免暴力破解。我们可以调整优先级数字使执行顺序为ip-filter(5) injection-filter(8) jwt-auth(10) rate-limiter(20) request-log(-100)。步骤 5功能测试IP 黑名单测试在配置中添加自己客户端的 IP如使用curl的本地 IP 或 Docker 网关 IP可通过ifconfig或请求/ip接口查看网关感知到的 IP。加入后访问curlhttp://localhost:9700/api/test返回 403IP xxx is blocked。移除后恢复。SQL 注入测试# 查询参数携带 SQLcurlhttp://localhost:9700/api/test?id1%27%20OR%20%271%27%271# 返回 400Malicious query detected# Body 携带 XSScurl-XPOST http://localhost:9700/api/test-HContent-Type: application/json\-d{name:scriptalert(1)/script}# 返回 400请求体大小限制测试# 生成一个大于 1MB 的文件尝试上传ddif/dev/zerobs1024count2048bigfile.jsoncurl-XPOST http://localhost:9700/api/upload-HContent-Type: application/json--data-binary bigfile.json# 返回 413组合测试黑名单 IP 发送注入 payload应优先被 IP 插件拦截403而不是注入检测400。验证插件短路顺序。四、成果测试与验证约 1 小时测试清单检验项方法通过标准IP 黑名单拦截添加本地 IP 到黑名单访问403 响应消息包含 IPIP 白名单模式改为 whitelist只允许特定 IP其他返回 403白名单内可访问外拒绝CIDR 网段匹配配置192.168.0.0/16同网段 IP 被拦截匹配成功SQL 注入检测发送含 OR 11的请求400XSS 检测发送含script的 Body400正常请求通过发送无恶意内容的请求200Body 大小超限发送超过阈值的 Body413Body 大小正常发送小 Body正常通过插件执行顺序黑名单 IP 发送注入请求应返回 403 而非 400IP 插件优先动态配置修改 Nacos 黑名单列表发布后新 IP 立即被拦截无需重启安全性增强建议定期更新 SQL/XSS 正则库结合开源安全库如voku/anti-xss获得更全面的防护。对注入检测进行告警日志记录攻击来源 IP 和 payload供安全团队分析。引入CSRF Token 验证插件适用于表单提交场景。对文件上传接口增加文件类型白名单检查。五、今日作业与学习产出提交代码三个安全插件及中间件Nacos 配置示例。完善安全模块将 SQL/XSS 正则配置移到 Nacos支持动态调整不重启生效。实现请求频率异常检测同一 IP 在短时间内触发多次安全拦截自动加入临时黑名单。学习笔记画出安全插件在请求链中的位置和优先级关系图。总结 API 网关安全防护的最佳实践与 WAFWeb Application Firewall对比。挑战任务集成ModSecurity 规则或OWASP Core Rule Set通过文件或 Redis 加载提升检测能力。实现请求重放检测基于 Nonce Timestamp 验证请求是否被重放防篡改。通过今天的学习你的网关已经具备了多层安全防护盾能有效抵御常见的 Web 攻击成为名副其实的“智能防火墙”。明天我们将搭建可视化后台让这些配置的管理更加直观和便捷。
RELATED

相关推荐

部署实战(三):ICP备案通过后,从HTTPS证书签发到微信小程序域名配置

部署实战(三):ICP备案通过后,从HTTPS证书签发到微信小程序域名配置

部署实战系列 📌 部署实战(一):2核2G轻量服务器 Docker 部署 Java 全栈及小程序上线避坑指南 部署实战(一):2核2G轻量服务器Docker部署Java全栈及小程序上线避坑指南-CSDN博客 📌 部…

📅 2026/10/26 1:54:07
前端教学5:视口 vs 文档 —— 滚动改变不了视口大小

前端教学5:视口 vs 文档 —— 滚动改变不了视口大小

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>案例四&#xff1a;视口 vs 文档 —— 滚动改变不…

📅 2026/10/26 1:54:07
微信小程序学习笔记|案例 3.10 文件引用 include 标签

微信小程序学习笔记|案例 3.10 文件引用 include 标签

一、案例简介 本案例学习小程序 include 文件引入语法&#xff0c;把页面拆分成多个独立 wxml 片段&#xff08;头部标题、正文、页脚、拓展阅读&#xff09;&#xff0c;实现代码复用。 课后扩展需求&#xff1a;增加两个按钮&#xff0c;控制拓展阅读内容的显示与隐藏。 二、…

📅 2026/10/26 1:54:07
MORE NEWS

更多资讯

📰

AI生成代码仅需几秒,为何验证要半个月?嵌入式安全开发全解析

“AI生成代码几秒钟&#xff0c;测试验证和路试可能要半月”——这句话一出来&#xff0c;懂的人都懂。前阵子我们某个电控功能迭代&#xff0c;让AI辅助生成了一段控制器代码&#xff0c;从按下回车到代码落地&#xff0c;确实只花了几秒钟。但后续的代码评审、静态分析、单元…

📰

AI智能体开发框架核心技术解析与实践指南

1. AI智能体开发框架概述AI智能体&#xff08;Agent&#xff09;开发框架正在成为人工智能领域的新热点。作为一名长期从事AI系统开发的工程师&#xff0c;我见证了从传统规则引擎到现代智能体的技术演进过程。当前主流的智能体框架已经能够支持复杂决策、环境交互和持续学习等…

📰

AI智能体开发框架解析与应用实践

1. AI智能体开发框架概述AI智能体&#xff08;Agent&#xff09;开发框架正在成为当前人工智能领域最热门的技术方向之一。作为一个长期从事AI系统开发的从业者&#xff0c;我见证了从传统规则系统到现代智能体的演进过程。如今的AI智能体已经不再是简单的任务执行者&#xff0…

📰

Linux kernel日志解析:定位底层故障的核心技术

1. 什么是kernel日志&#xff1a;系统底层的“黑匣子”与运维人员的第一手证据你有没有遇到过服务器突然卡死、服务莫名中断、磁盘IO飙升到99%却查不到哪个进程在作怪&#xff1f;或者容器反复重启&#xff0c;kubectl get pods只显示CrashLoopBackOff&#xff0c;但kubectl lo…

📰

Linux kernel日志原理与实战:从dmesg到故障根因分析

1. 什么是kernel日志&#xff1a;系统底层的“黑匣子”与运维人员的第一手证据“kernel日志”这四个字&#xff0c;听起来像Linux教科书里的术语&#xff0c;但对每天盯着服务器面板、排查半夜告警、调试驱动异常的从业者来说&#xff0c;它不是概念&#xff0c;而是现场——是…

📰

架构图之外:常见软件架构模式的依赖约束与选型

接手一个项目的第二天&#xff0c;我在代码仓库里看到三个包互相引用&#xff1a;订单相关的包调用库存相关的包&#xff0c;库存相关的包反过来又调用订单相关的包&#xff0c;中间还夹着一个名字里带 common 的包被两边同时依赖。项目文档里那张架构图画得很干净&#xff0c;…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬