用Burp Suite挖掘API隐藏端点:从JS文件和接口文档入手

聊个让我印象很深的场景。一次授权范围内的安全评估中,我们把目标系统页面翻了个遍,功能流程都测完了,总觉得覆盖面还差得远。后来把目光转向JS文件和后台流量,结果从里面发现了二十多个页面里根本看不到的API接口,其中有一个只做内部调用的接口直接暴露了核心数据。那之后我的测试习惯彻底变了:Web界面只是入口,API才是真正的主战场。今天这篇就聊聊,怎么用Burp Suite配合插件做API隐藏端点挖掘,把这块平时容易被忽略的攻击面系统性地捞出来。

API隐藏端点挖掘本质上是在做一件事:找出那些没有出现在页面上、没有挂在导航菜单里、但真实存在于服务端的接口路径。这些端点可能对接入内部系统、操作敏感数据,也可能因为代码分支或旧版本残留而意外开放。对做安全评估的人来说,多找到一个这样的端点,往往就意味着多一条风险线索;对开发或运维的同学来说,这也是理清自身资产边界的重要参考。

1. 为什么API比传统Web页面更需要单独的挖掘思路

1.1 API在业务系统里的位置远比想象中更核心

现在的前后端分离架构早就是主流了,前端页面负责展示和交互,真正的业务逻辑几乎全部由后端API承载。无论是用户登录、商品列表、订单提交还是文件上传,浏览器里看到的所有操作,本质上都在调用某个API接口。

移动端应用就更明显了。手机App打开后的每一个页面,数据都是从API拉下来的。甚至有些系统根本没有Web页面,纯靠接口对外提供服务。这意味着,如果你只盯着浏览器里肉眼可见的URL做测试,那看到的充其量是企业想让你看到的那部分;更庞大的接口集合,藏在JS脚本、App安装包、接口文档和服务器配置里。

1.2 隐藏端点最常见的三个来源

结合平时实际的测试经验,我总结API隐藏端点主要来自以下三处:

  • 前端JS文件里硬编码的路径。很多系统为了开发方便,直接把API路径写在全局配置文件或业务脚本中。比如某个管理后台的config.js里,可能躺着/admin/api/getAllUsers这样的路径,而页面上根本没有对应入口。这类路径因为承担内部逻辑,往往缺少严格的权限校验,风险很高。

  • Swagger等接口文档暴露的信息。不少团队在开发环境开启了接口文档,上线时忘记关闭,或者为了调试方便把文档放在生产环境某个路径下。只要被访问到,整个系统的接口列表、参数结构、数据结构一览无余。这是我最喜欢的端点来源,因为信息密度极高。

  • 历史遗留或未下线的内部接口。功能迭代时,旧的接口地址经常没有被及时移除。这些接口可能调用内部服务、查询旧表、执行管理操作,而且因为长期无人维护,验证逻辑往往停留在很早之前,甚至完全没有鉴权。

1.3 常规Web扫描为什么很难覆盖到API

传统的Web漏洞扫描器依赖爬虫从HTML页面提取链接,然后顺着链接去测试。但API的路径往往不是静态链接,而是由前端JavaScript在运行时动态拼接出来的。比如页面加载后,脚本先读取服务器下发的配置,再拼出完整的请求地址。扫描器的爬虫只能看到页面结构和静态资源,看不到这些动态生成的请求。

SPA单页应用就更典型了。整个应用只有一个index.html,其余内容全靠异步请求拉取。如果只用普通爬虫模式去扫,只能得到一个空的页面外壳,所有API请求都发生在浏览器完成渲染之后。所以做API端点挖掘,必须换一套思路,从流量、脚本内容和接口规律入手。

2. 用Burp Suite做API端点的插件选型与安装

2.1 插件那么多,真正实用的就这几类

Burp Suite的BApp Store和各类开源社区里,API相关的扩展插件数量不少,但质量参差不齐。我从实用角度把它们分成三类,大家在选型时可以有个清晰的方向。

插件类型代表工具主要作用适用场景
API路径扫描类APIKit、APIFinder从JS内容中匹配API路径并发起探测目标页面少、接口藏在脚本里
JS内容分析类LinkFinder、JSFinder提取JS文件中的URL、路径和敏感字符串目标有大量业务JS文件时效率极高
辅助增强类Hakrawler、Built-in Sitemap扩展抓取全站链接、自动爬取子域名与路径信息收集阶段广撒网

我自己最常用的是APIKit和LinkFinder的搭配。APIKit擅长把JS里符合API格式的字符串挑出来,LinkFinder则能把JS中所有可能带参数的路径捞干净。两者互补,一个偏接口语义,一个偏路径覆盖。

2.2 插件安装的常见坑和注意事项

Burp Suite扩展加载有几种方式,操作本身不复杂,但有几个坑需要提前避开。

BApp Store里的插件可以直接在Burp的扩展面板搜索安装,这个最省事。但部分插件因为长时间未更新,在较新的Burp版本上可能报兼容性问题。遇到这种情况,可以先到扩展详情的描述页确认它支持的最低Burp版本。

手动导入时,.jar格式的扩展直接选Java类型加载;如果是.py格式的扩展,需要先确认Burp已经正确配置了Jython Standalone包。很多人在这一步踩坑,明明扩展文件加载了,但日志里报ModuleNotFoundError,其实就是Jython环境没配好或者版本对不上。

加载完插件后,先在Extender面板的Output和Errors标签里确认有没有报错。这一步很多人忽视,结果插件表面加载了,实际功能完全没生效,白忙一场。建议每个插件加载后,先在本地测试环境跑一次,确认日志正常,再投入正式工作。

2.3 环境准备:代理、证书和浏览器配置

扩展装好了,还得保证Burp能精准捕获流量。做API端点挖掘时,我不建议直接把所有流量都导进来,容易噪音太大。更稳妥的做法是,只给火狐或Chrome单独配一个代理会话,或者用Burp自带的浏览器,专门用于本次测试。

证书导入这个步骤躲不开。HTTPS流量不解密的话,Burp看不到请求正文,所有基于请求内容的分析全部失效。证书导入后,访问任意HTTPS网站确认地址栏没有证书警告,再开始工作。移动端测试的话,还需要把代理指向同一网络,并在手机里安装和信任同一张证书,流程类似。

3. 挖掘API隐藏端点的核心思路与配置细节

3.1 被动收集:先把流量里的线索捞干净

被动收集是所有API端点挖掘的第一步,也是最安全的一步。它的核心逻辑很简单:依靠正常浏览操作产生的真实流量,从Burp的HTTP History和Sitemap里提取API路径。

具体操作上,我会把整个浏览过程分成三个环节来观察:

  • 登录前逛一圈公开页面,记录未认证状态下的请求;
  • 登录后把主要业务功能都点一遍,包括查看列表、提交表单、上传文件、删除数据等;
  • 如果有多个角色,分别切换账号重复上面的过程。

每次请求都会在Burp历史里留下记录。利用前面提到的插件,在历史记录上右键扫描,插件会自动提取所有响应中出现的API路径。这个过程的价值在于,流量中的接口是真实被调用过的,可信度极高,不是靠猜出来的。

3.2 主动枚举:从路径规律和静态内容里挖出隐藏面

被动收集能发现已经存在的流量,但很多隐藏端点从未被调用过,必须靠主动枚举来发现。

最有效的方式之一,是从JS文件里提取路径。前端脚本中经常写有注释、配置文件、备用接口地址。我用LinkFinder扫描一次JS文件后,经常会看到/api/internal/health、/debug/session这类路径。有些路径甚至带着完整参数名,这对后续判断参数结构非常有帮助。

另一种方式是路径模式枚举。API路径常见规律包括版本号(v1、v2)、资源类型(user、order、config、admin)、操作类型(get、list、update、delete)。结合目标系统的功能命名习惯,我可以构造一批候选路径,把路径基线放到Burp Intruder或者支持自定义字典的插件里批量探测。这个思路用到的是路径模式,不是密码爆破,合规上是完全站得住的。

配置自定义提取规则时,我常用一个基础正则作为起点,再根据目标系统做调整:

(?i)\b(?:api|api/v\d+)/[A-Za-z0-9_\-/{}]+

然后加上过滤条件,排除常见的静态资源后缀:.js、.css、.png、.jpg、.svg、.woff等。把这些过滤规则写进去,能去掉大量无效结果。

3.3 判断端点价值:从响应状态码里读出业务线索

枚举出来的路径很多,但不是每个都值得跟进。我的经验是,用HTTP状态码做第一轮筛选,效率最高。

下面是几种常见响应及其含义,我在实际工作中形成了一张速查表:

状态码含义是否值得跟进
200端点存在且返回内容重点跟进,立即查看响应体
204端点存在,无返回内容跟进,说明接口逻辑正常
301/302端点存在,发生重定向跟进,查看跳转目标
400参数错误或请求格式不对跟进,说明路径本身是有意义的
401未认证重点跟进,接口存在但受保护,值得测后续逻辑
403禁止访问重点跟进,说明路径已被路由识别
404不存在放弃
405方法不允许重点跟进,说明路径存在,只是用错了HTTP方法

一个容易被忽略的细节是:很多接口对不存在的路径统一返回404或200空页面,这是服务端框架做了兜底处理。这种情况下,纯看状态码会漏掉大量真实端点。所以我会把响应长度、响应关键词也纳入判断维度。如果两个路径返回的页面结构高度一致,大概率是同一个404兜底页;只有当响应结构异常、长度差异明显或出现JSON数据时,才说明路径真实存在。

4. 一次API隐藏端点挖掘的完整实战记录

4.1 先明确边界:授权范围和测试目标

任何API端点挖掘工作开始之前,第一步永远是确认授权范围。我在实际项目里,每次都会把目标域名、URL前缀、允许的测试方法和时间窗口写清楚,并且只在范围内操作。这个习惯能避免很多不必要的麻烦,也让我在做测试时能放开手脚聚焦技术问题。

以下记录的是某次评估的流程,目标是一个带后台管理功能的业务系统,授权范围明确限定在某条域名路径之下。我的目标是找出页面上可见接口之外的所有API端点,并确认哪些可能暴露了敏感信息。

4.2 用插件批量提取JS文件中的API路径

拿到目标后,我先把系统首页和管理后台的JS文件列表整理出来。用浏览器登录后台,打开网络面板,把所有加载过的.js文件路径记录下来,再通过Burp的历史记录确认这些文件有没有经过代理。

确认代理捕获成功后,我在LinkFinder里输入JS文件的URL,让它逐个提取路径。一次跑完后,结果里出现了大量意料之外的路径,包括:

  • /api/v1/user/info
  • /api/internal/auth/callback
  • /api/private/system/config
  • /api/admin/grant/list

其中/api/internal/auth/callback这个路径,页面里完全没有入口,但在JS文件里被注释标记为“预留接口”。它带着auth字样,说明跟认证流程有关,潜在价值很高。我把这类路径单独标记为高优先级。

4.3 顺藤摸瓜:从接口文档中扩大收集面

提取到一批API路径后,我没有急着逐个发请求,而是先试试常见接口文档路径,比如/swagger-ui.html、/api-docs、/v2/api-docs、/swagger/index.html。这是扩大战果最直接的手段。

这次运气不错,访问/swagger-ui.html时返回了正常的页面。顺着Swagger JSON里的定义,我拿到了一份完整的接口清单,里面包含了系统所有的controller路径、请求方法、参数定义。这份清单比从JS文件里捞出来的还要全面,很多内部管理接口都在列。

文档中有一个/api/internal/task/execute的接口,方法为POST,参数包含一个任务类型字段。从名称和参数结构判断,它很可能是一个可执行内部任务的接口。这个发现直接改变了整个评估的关注重点。

4.4 用Burp Repeater验证端点是否存在

文档归文档,真实环境里很多接口文档有残留但接口已经下线。所以我对每个高优先级端点,都用Burp Repeater发一个最小请求来验证存在性。

验证分两步。第一步,先发一个不带任何参数的GET请求,观察返回。如果返回401或400,说明路由是真实存在的,只是需要额外参数或认证。如果返回404,则说明该接口在当前环境可能已下线。

第二步,对于确认存在且返回JSON结构的接口,我再构造带基础参数的请求,观察接口的响应字段。这里需要特别注意,不要发送任何会改变数据的写操作请求,只做读操作或空参数验证,避免对目标系统造成实际影响。整个过程始终保持在授权范围内,这是我做验证的铁律。

经过验证,/api/admin/grant/list返回了JSON数组,数组里的字段包含账号名和权限标识。仅凭这个发现,就能确认系统存在未在页面暴露的权限查询接口,这对资产梳理来说是一个明确风险线索。

4.5 整理结果:把散落端点沉淀成资产清单

验证完成后,我把所有端点按业务模块、风险等级、验证状态分类,整理成一张资产清单。清单字段包括:接口路径、HTTP方法、来源(JS文件、Swagger、流量)、验证状态、响应特征、风险说明。

整理这个清单的过程本身,就是对系统资产的一次重新梳理。有些端点虽然风险不高,但明确了它们是存在的,后续维护和测试就有了基础。这一步我认为是整个流程最有价值的产出,比单纯报告“发现了多少个接口”有意义得多。

5. 常见问题与排查技巧实录

5.1 误报太多,结果淹没在海量URL里

用插件跑API端点挖掘,最头疼的问题就是误报。尤其是JS文件中各种字符串拼接、注释乱码、常量定义,都会被正则当成路径捞出来。

我常用的降噪手段有三条:

  • 设置扩展名白名单,只保留以/api、/rest、/internal、/admin等常见API前缀开头的路径;
  • 过滤响应内容类型,只分析application/javascript和application/json的响应,跳过图片、字体、媒体文件;
  • 在提取规则里加上关键词约束,比如路径中必须包含api、v1、v2、user、order、config等业务特征词。

经过这三层过滤,有效结果的比例能明显提升。宁可漏掉个别冷门路径,也不让生成的报告被几千条噪音淹没,否则看报告的人根本抓不住重点。

5.2 插件不出结果,先从这四步排查

很多人在插件“完全不工作”时,第一反应是换工具。但大多数情况下,问题出在配置而不是工具本身。按以下顺序排查,基本能定位问题:

  1. 确认扩展已成功加载,且Errors标签里没有异常堆栈;
  2. 确认代理链路通畅,浏览器里打开Burp代理页面测试是否能正常访问;
  3. 确认HTTPS证书已信任,Burp历史里能看到明文请求体;
  4. 确认JS文件确实经过了代理,而不是被浏览器缓存策略直接命中。

第四点容易被忽略。浏览器开启缓存时,JS文件可能直接从本地加载,Burp根本看不到内容。解决方式是勾选Burp代理选项里的Disable cache,或者在测试前先清理一次浏览器缓存。

5.3 碰到SPA单页应用,流量少得可怜

现代前端框架构建的应用,所有请求都在浏览器端异步发起,传统代理抓取模式看到的初始请求非常少。

应对方案很简单:用Burp自带的浏览器手动操作目标系统,把每个功能模块都点开一遍。还有一种更省力的方式,借助浏览器开发者工具的“强制刷新”和“模拟慢速网络”,让JS文件确保从服务器拉取而不是走缓存。实际跑下来,这种方法能捕获到大部分API请求。

5.4 合规边界:挖掘端点不等于无条件访问

整个API端点挖掘技术本身是资产梳理和风险评估工作的一部分,但有一点必须反复强调:所有探测行为,都必须限定在明确授权且确认安全的范围内。未授权情况下对任何接口做枚举或探测都是越界行为,即使出发点只是“看看有没有”,也同样不可取。

在授权测试中,我也给自己定了几条执行准则:只发送不改变业务数据的读操作请求;不对单一路径做高频并发探测,避免对服务端造成压力;发现可疑端点后及时在记录里标注,而不是继续深入测试数据本身。守住这些边界,整个工作才能真正帮到企业,而不是制造新的问题。

写在最后的操作习惯

API隐藏端点挖掘做多了,会发现它已经不只是安全评估的专项工作,更像是一种日常的测试视角。我现在拿到任何目标,都会下意识先问自己:页面上能看到哪些功能、JS里埋了哪些路径、接口文档有没有残留、历史流量里有没有被遗忘的调用。这套思路配合Burp Suite插件,能把以前漏掉的攻击面系统性地捡回来。

最后分享一个小技巧。API路径枚举用的字典,不要总用网上现成的大字典,更有效的是基于目标系统自身的命名习惯去构造。比如它的Web路径都习惯用/web/开头,那API很可能就是/api/;它的业务模块叫“订单中心”,那API里基本会有order相关路径。从目标自身的代码风格和生活习惯去推断命名模式,命中率往往远超通用字典。这是我在几次实战中验证过最有效的办法,也是API端点挖掘最有意思的地方——它不是机械跑工具,而是跟系统设计者在代码风格上的一次隔空对话。

相关新闻

卫星通信仿真入门:多普勒时变模型与误码率工程实践

卫星通信仿真入门:多普勒时变模型与误码率工程实践

简介:SECS(半导体设备通信标准)通讯模拟器面向晶圆制造自动化领域的设备工程师、软件集成商与产线运维人员,用于在真实设备接入前完成设备与主机之间基于 SECS-I 与 SECS-II 的消息交互验证与调试。压缩包内含 36 个文件&#xff…

2026/10/20 22:31:04 阅读更多 →
从零搭建PPT自动化生成工具:python-pptx技术选型与核心实现

从零搭建PPT自动化生成工具:python-pptx技术选型与核心实现

1. 从零搭建一个PPT自动化生成工具,我为什么选了这条路做技术分享这些年,被问得最多的问题之一就是:“有没有办法让PPT自动生成?”问的人有做数据分析的、有做项目汇报的、也有做教学课件的。他们的共同痛点是:内容已经…

2026/10/20 22:29:59 阅读更多 →
图表设计方法论:从认知负荷到团队规范的系统化实践

图表设计方法论:从认知负荷到团队规范的系统化实践

1. 从"diagram-design"这个标题能读出什么第一次看到"diagram-design"这个标题,我脑子里蹦出来的第一个判断是:这大概率不是一个单纯的"画图工具推荐",而是一个关于图表设计方法论或者图表设计系统的项目。为什…

2026/10/20 22:29:59 阅读更多 →

最新新闻

context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

1. 从"context-mode"这个词说起:它到底在解决什么问题第一次看到"context-mode"这个标题,很多人会下意识地把它当成某个框架里的配置项,或者某个库的开关参数。但如果你真的在工程一线待过几年,就会意识到这个…

2026/10/20 23:14:43 阅读更多 →
Windows内核安全编程实战:进程/文件/注册表三重监控框架

Windows内核安全编程实战:进程/文件/注册表三重监控框架

简介:这是一份基于VC开发的360杀毒软件高仿项目源码,面向C初学者及Windows桌面应用进阶学习者,旨在通过完整可运行的商业级UI框架实践,掌握MFC/WinAPI界面开发、多线程扫描逻辑、皮肤化UI设计(SkinUI库)、界…

2026/10/20 23:14:43 阅读更多 →
ArcGIS符号库本质:CIM驱动的空间语义编码系统

ArcGIS符号库本质:CIM驱动的空间语义编码系统

简介:本资源为ArcGIS专业制图用户必备的符号库集成包,面向GIS工程师、地图制图师及地理信息相关专业学习者,解决日常项目中符号缺失、风格不统一、制图效率低等实际问题。压缩包共142个文件,涵盖74个.style符号样式文件&#xff0…

2026/10/20 23:14:43 阅读更多 →
Java线程中断与Happens-Before:并发编程可见性规则实战解析

Java线程中断与Happens-Before:并发编程可见性规则实战解析

1. 线程中断:协作式取消的正确打开方式先把结论摆在这里:Java里的线程中断不是“强制终止线程”,而是一个协作式的通知机制。也就是说,A线程想停掉B线程,不能直接动手把B拽下来,而是给B打个招呼——“你该停…

2026/10/20 23:14:43 阅读更多 →
Linux Thermal温控模块详解:从框架设计到设备树配置实战

Linux Thermal温控模块详解:从框架设计到设备树配置实战

1. 项目概述1.1 为什么要啃Linux Thermal模块做嵌入式或者跑服务器的朋友应该都有这种体会:芯片性能越来越强,功耗密度越来越大,散热问题已经从“硬件工程师的烦恼”变成了“系统工程师的噩梦”。我自己手头负责的一块主控板,四核…

2026/10/20 23:14:43 阅读更多 →
N1刷飞牛NAS避坑指南:从U盘启动到救砖恢复完整流程

N1刷飞牛NAS避坑指南:从U盘启动到救砖恢复完整流程

N1刷飞牛NAS这件事,我前前后后帮人折腾过不少次,也在论坛里看过太多翻车案例。很多人拿到教程的第一反应就是下载镜像、拿U盘怼上去开刷,结果要么U盘启动不起来,要么写到一半断电黑屏,最后抱着一个点不亮的盒子到处问怎…

2026/10/20 23:13:40 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →