在 iOS 二进制中挖掘硬编码 HTTP URL:MASTG-DEMO-0084 实战剖析(OWASP MASTG)
文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载本文以 OWASP Mobile Application Security Testing GuideMASTG仓库中的 MASTG-DEMO-0084 为骨架讲解如何对已编译的 iOS 应用二进制执行静态分析定位硬编码的明文 HTTP 地址并结合 ATSApp Transport Security配置判断其真实危害。读者将掌握一条完整的实战链路解包 IPA → 用 radare2 脚本枚举http://字符串 → 通过交叉引用与反汇编追踪字符串的调用路径 → 结合 Info.plist 中的 ATS 例外评估风险从而能够在没有源码的情况下独立完成 MASTG-TEST-0321 的判定。一、Demo 背景一个注定失败的 iOS 网络样本MASTG-DEMO-0084属于 MASTG 的demos/ios/MASVS-NETWORK/目录是一个kind: fail的失败示例对应的测试用例是 MASTG-TEST-0321: Hardcoded HTTP URLs关联的安全弱点为 MASWE-0026。它的前身是MASTG-TEST-0065Testing Data Encryption on the Network后者已被标记为deprecated并由 MASTG V2 系列测试0321/0322/0236取代见 tests/ios/MASVS-NETWORK/MASTG-TEST-0065.md 的covered_by字段。配套样本由三部分构成见 MASTG-DEMO-0084 目录MASTestApp已编译的 Mach-O 主二进制MastgTest.swift对应的 Swift 源码用于对照验证二进制中的字符串与调用http_urls.r2run.sh驱动 radare2 的静态分析脚本与执行入口output.txt本次分析的完整输出即证据。需要强调MASTG-DEMO-0084讨论的是二进制层面的硬编码 URL 挖掘而兄弟 Demo MASTG-DEMO-0083 讨论的是Info.plist 层面的不安全 ATS 配置。两者互为印证——前者证明应用确实使用了明文 URL后者证明ATS 恰好放行了该域名合在一起才能构成完整的失败判定。二、样本代码硬编码 HTTP URL 的犯罪现场先看对应的源码 MastgTest.swift它直观展示了三类 URL 的对比import Foundation struct MastgTest { // SUMMARY: This sample demonstrates the use of hardcoded HTTP URLs in iOS apps. static let httpEndpoint http://httpbin.org/get // FAIL: [MASTG-TEST-0321] Hardcoded HTTP URL static let httpApiUrl http://example.com/api // FAIL: [MASTG-TEST-0321] Hardcoded HTTP URL static let httpsEndpoint https://httpbin.org/get // PASS: [MASTG-TEST-0321] HTTPS URL static func mastgTest(completion: escaping (String) - Void) { var result Testing HTTP URL connections:\n\n // Attempt to connect to HTTP endpoint if let url URL(string: httpEndpoint) { let task URLSession.shared.dataTask(with: url) { data, response, error in if let error error { result HTTP request to \(httpEndpoint) failed: \(error.localizedDescription)\n } else if let httpResponse response as? HTTPURLResponse { result HTTP request to \(httpEndpoint) returned status: \(httpResponse.statusCode)\n } completion(result) } task.resume() } else { result Invalid URL: \(httpEndpoint)\n completion(result) } } }代码注释直接标注了判定结论http://httpbin.org/get与http://example.com/api均为 FAIL硬编码 HTTP URLhttps://httpbin.org/get为 PASSHTTPS URL不触发该测试。关键调用链是URL(string: httpEndpoint)构造URL实例再交给URLSession.shared.dataTask(with:)发起请求——这是 iOS 标准 URL Loading System 的用法因此受 ATS 管控这一点对后续判定至关重要如果应用改用低层 APIATS 根本不生效见下文第六节的讨论。三、实战步骤用 radare2 从二进制中挖出 URL3.1 解包并定位主二进制依据技术文档 MASTG-TECH-0058: Exploring the App Package首先解压 IPA本质是一个 zip 包进入.app包并定位主二进制。本例中路径为./Payload/MASTestApp.app/MASTestApp3.2 编写 radare2 分析脚本MASTG-DEMO-0084使用 radare2iOS 作为分析引擎其脚本 http_urls.r2 内容如下e asm.bytesfalse e scr.colorfalse e asm.varfalse ?e Uses of http:// URLs: iz~http:// ?e ?e xrefs to http://httpbin.org/get: axt 0x100006c60 ?e ?e Use of http://httpbin.org/get: pd 15 0x100005130 ?e ... pd-- 5 0x100005238逐条解读脚本的意图e asm.bytesfalse/e scr.colorfalse/e asm.varfalse关闭字节显示、彩色输出与变量名折叠保证输出干净、利于后续 grep 与归档iz~http://iz列出 Mach-O__TEXT.__cstring段中的字符串~是 radare2 内置过滤器等价于 grep筛出所有含http://的字符串axt 0x100006c60axt列出该地址的交叉引用xrefs找出谁引用了http://httpbin.org/get字符串pd 15 0x100005130在引用点反汇编 15 条指令展示字符串如何被使用pd-- 5 0x100005238从0x100005238往前反汇编 5 条指令展示 URLSession 相关调用点。3.3 执行脚本run.sh 是唯一的执行入口一条命令完成分析#! /bin/bash r2 -q -i http_urls.r2 -A MASTestApp output.txt参数说明-qquiet 模式抑制交互提示-i http_urls.r2以批处理方式执行脚本-A启动时自动完成全量分析aa 等分析步骤生成函数、交叉引用数据库——没有这一步axt与pd无法给出有意义的符号级结果 output.txt将结果重定向保存为证据文件。值得说明radare2 是开源逆向框架而 rabin2 是它的姊妹命令行工具常用于快速抽取二进制信息导入导出、数据段字符串、交叉引用、入口点、架构类型等。在本流程中 radare2 承担了交互式深度分析的角色两者配合可以覆盖从快速枚举到逐指令追踪的不同需求。四、观察output.txt 揭示的二进制证据运行后得到的 output.txt 是本 Demo 的核心证据分三段呈现。4.1 明文 URL 字符串清单Uses of http:// URLs: 0 0x00006bd0 0x100006bd0 56 57 2.__TEXT.__cstring ascii HTTP request to http://httpbin.org/get returned status: 1 0x00006c10 0x100006c10 47 48 2.__TEXT.__cstring ascii HTTP request to http://httpbin.org/get failed: 2 0x00006c60 0x100006c60 22 23 2.__TEXT.__cstring ascii http://httpbin.org/get 3 0x00006c80 0x100006c80 36 37 2.__TEXT.__cstring ascii Invalid URL: http://httpbin.org/get\n各列含义序号 / 文件偏移 / 虚拟地址 / 字符串长度 / 段名 / 类型 / 内容。四条命中全部落在__TEXT.__cstring段且都指向同一个 URLhttp://httpbin.org/get——既包含直接请求的 URL 本体也包含拼接进日志文案的间接引用。值得注意的是源码中还存在http://example.com/api但在该二进制路径下未出现在本次输出中说明具体运行代码路径不同字符串清单会随之变化本次 Demo 的mastgTest只实际使用了httpEndpoint。4.2 交叉引用谁引用了该字符串xrefs to http://httpbin.org/get: sym.func.100005024 0x100005130 [STRN:r--] add x8, x8, str.http:__httpbin.org_getradare2 定位到函数sym.func.100005024其内部0x100005130处有一条add x8, x8, 0xc60指令将寄存器指向字符串地址0x100006c60。这证明该 URL不是死字符串而是被某函数实际取用。4.3 反汇编完整的调用链│ 0x100005130 add x8, x8, 0xc60 ; 0x100006c60 ; http://httpbin.org/get │ 0x100005134 sub x27, x8, 0x20 │ 0x100005138 mov x0, x24 │ 0x10000513c bl sym.imp.swift_retain │ 0x100005140 mov x0, x23 ; void *arg0 │ 0x100005144 bl sym.imp.swift_bridgeObjectRetain ; void *swift_bridgeObjectRetain(void *arg0) │ 0x100005148 orr x1, x27, 0x8000000000000000 │ 0x10000514c mov x8, x26 │ 0x100005150 mov x0, 0x16 │ 0x100005154 movk x0, 0xd000, lsl 48 │ 0x100005158 bl sym.imp.Foundation.URL.string_...cfC_ ; Foundation.URL.string(...cfC) │ 0x10000515c ldr x8, [x28, 0x30] │ 0x100005160 mov x0, x26 │ 0x100005164 mov w1, 1 │ 0x100005168 mov x2, x22 ... │ 0x100005224 mov x0, x27 │ 0x100005228 mov x1, x26 │ 0x10000522c mov x2, x22 │ 0x100005230 blr x8 │ 0x100005234 adrp x8, segment.__DATA ; 0x10000c000 │ 0x100005238 ldr x0, [x8, 0xc8] ; [0x10000c0c8:4]158 │ ; reloc.NSURLSession ; void *arg0 │ 0x10000523c bl sym.imp.objc_opt_self ; void *objc_opt_self(void *arg0) │ 0x100005240 adrp x8, segment.__DATA ; 0x10000c000 │ 0x100005244 ldr x1, [x8, 0xa0] ; [0x10000c0a0:4]0x6e87 ; reloc.fixup.sharedSession ; char *selector │ 0x100005248 bl sym.imp.objc_msgSend ; void *objc_msgSend(void *instance, char *selector)对照源码逐段还原0x100005130字符串http://httpbin.org/get被装入寄存器即源码中URL(string: httpEndpoint)的实参准备0x100005158调用Foundation.URL.string(...)构造URL实例——对应源码第 14 行URL(string: httpEndpoint)0x100005238起加载reloc.NSURLSession、调用objc_msgSend获取sharedSession重定位引用reloc.fixup.sharedSession随后发起会话请求——对应源码第 15 行URLSession.shared.dataTask(with: url)。至此从字符串到URL构造再到URLSession的三级调用链在反汇编层面被完整闭合这正是 MASTG-DEMO-0084 判定该 URL 确实被应用使用的硬证据。五、评估为什么判定为 FAILMASTG-DEMO-0084的结论是明确的失败kind: fail依据有两条缺一不可二进制中存在硬编码的明文 URLhttp://httpbin.org/get被实际使用见上文调用链触发 MASTG-TEST-0321ATS 配置放行了该域名应用在 Info.plist 中通过NSExceptionDomains为httpbin.org配置了NSExceptionAllowsInsecureHTTPLoads true相关细节见 MASTG-DEMO-0083因此该 HTTP 请求不会被 ATS 拦截能够真正发出明文流量。两者结合说明硬编码 URL从潜在风险升级为实际可利用的明文通信缺陷。需要特别留意 MASTG-TEST-0321 的局限性说明见 MASTG-TEST-0321.md二进制中存在 HTTP URL 并不意味着它一定被用于通信。其使用与否取决于运行时条件例如 URL 如何被调用、应用 ATS 配置是否允许明文流量。当 ATS 启用且未配置例外时HTTP 请求可能直接失败见 MASTG-TEST-0322而如果应用使用绕过 ATS 的低层 API请求则可能成功同样见 MASTG-TEST-0322。因此静态分析必须与动态验证互补例如通过中间人代理捕获真实网络流量确认应用在运行期确实向这些 HTTP 地址发起连接对应 MASTG-TEST-0236 的动态测试思路以及 MASTG-TEST-0065 中ATS 配置与真实流量可能不一致的告诫——即使 Info.plist 禁用了明文低层 API 或配置不当的跨平台框架仍可能偷偷发送 HTTP。六、知识延伸ATS 例外与明文流量判定要点由于 MASTG-DEMO-0084 的判定强依赖 ATS 上下文这里补充 MASTG-TEST-0065 / MASTG-TEST-0322 中的关键知识点iOS 9.0 起ATS 默认阻止明文 HTTP但存在多种后门使应用仍可发送明文在NSAppTransportSecurity中将NSAllowsArbitraryLoads设为true全局关闭iOS 10 起可用NSAllowsArbitraryLoadsInWebContent关闭 WebView 内容的 ATS 限制通过NSExceptionDomains为指定域名配置NSExceptionAllowsInsecureHTTPLoads true本 Demo 即属此类。ATS 不适用于低层网络接口如 Network framework、CFNetwork。Apple 官方建议优先使用 URL Loading System 这类高层框架因为低层 API 的安全责任完全落在开发者身上且犯错容易、代价高昂见 MASTG-TEST-0065.md 引用的 Apple 文档。ATS 例外并非一律不可接受如 Firefox iOS 出于浏览器产品定位全局禁用 ATS 即属合理例外但即便如此也应在 ATS 配置中包含 justification 说明字符串。静态检查的注意点应同时覆盖应用主二进制之外的内嵌扩展、framework、Watch App 等所有可执行组件见 MASTG-TEST-0065.md。对应到本 Demo 的 Info.plist可以看到一个叠满了 buff的不安全配置NSAllowsArbitraryLoads、NSAllowsArbitraryLoadsInWebContent、NSAllowsArbitraryLoadsForMedia、NSAllowsArbitraryLoadsForLocalNetworking全部为true外加api.example.com与httpbin.org两个域名级例外。MASTG-DEMO-0083 的评估还指出一个易被忽视的细节当NSAllowsArbitraryLoadsForLocalNetworking、NSAllowsArbitraryLoadsForMedia、NSAllowsArbitraryLoadsInWebContent存在时无论取值NSAllowsArbitraryLoads会被忽略。而本 Demo 中实际生效的是httpbin.org的域名级例外——正是它让http://httpbin.org/get的请求得以放行。七、总结与可复用的检测方法论MASTG-DEMO-0084 给出了一条可复用的无源码 iOS 明文 URL 审计流水线解包定位按 MASTG-TECH-0058 解压 IPA定位主二进制Payload/*.app/*字符串枚举radare2 的iz~http://快速筛出__TEXT.__cstring中的明文 URL引用追踪axt 地址找到引用者pd反汇编还原URL构造与URLSession调用链确认 URL 是否真正在用ATS 交叉验证检查 Info.plist 的NSAppTransportSecurity判断明文请求是否会被放行动态确认用代理抓包验证运行期真实流量避免误报/漏报对应 MASTG-TEST-0236。整套流程所需的证据文件——分析脚本、执行命令、输出结果——均可在仓库的 MASTG-DEMO-0084 目录 中直接复现验证。它同时展示了 MASTG 方法论的核心字符串存在 ≠ 实际使用实际使用 ATS 放行 ≠ 必然失败——每一步结论都必须有二进制级证据支撑这正是安全测试从扫描走向验证的关键。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐Arduino-ESP32 上手指南ESP32 安装到 WiFi 连接三步走Arduino ESP32 上手指南ESP32 安装到 WiFi 连接三步走 把一块 ESP32 开发板插上电脑几行熟悉的 C 代码就能让它连上 WiF文档教程网络安全PaddleSpeech RESTful API 解析语音服务端接口设计与实战调用指南PaddleSpeech RESTful API 解析语音服务端接口设计与实战调用指南 导读 本文围绕 PaddleSpeech 服务端 RESTful 接口文档教程网络安全MASTG 安卓硬编码加密密钥检测用 semgrep 与 SecretKeySpec 静态分析实战MASTG-DEMO-0017MASTG 安卓硬编码加密密钥检测用 semgrep 与 SecretKeySpec 静态分析实战MASTG DEMO 0017 本篇文章基于 OWASP文档教程网络安全上一篇boardgame.io 调试指南Debug 面板、Redux 增强器与服务器日志的完整实践下一篇ZCode 语音输入组件 SpeechInput 实战指南Web Speech API 与 MediaRecorder 双引擎语音转文字方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

xberg 中配置 LLM 并发:max_concurrency 与提取线程预算的独立调优

xberg 中配置 LLM 并发:max_concurrency 与提取线程预算的独立调优

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with …

2026/10/7 9:59:41 阅读更多 →
云端任务输出增长后:本地扩容数据盘与项目网盘的关机计费边界

云端任务输出增长后:本地扩容数据盘与项目网盘的关机计费边界

云端 GPU 任务跑了一段时间以后,存储判断通常会比创建实例时复杂。 原因很简单:模型输出、日志、检查点或成果文件已经产生,此时即使计算实例已经关机,文件占用并不会因为“计算停止”自动消失。 因此,遇到“实例已经关…

2026/10/7 9:58:40 阅读更多 →
Language Server Protocol TextDocumentItem 详解:客户端向服务器传输文档的四大字段与语言标识符规范

Language Server Protocol TextDocumentItem 详解:客户端向服务器传输文档的四大字段与语言标识符规范

开发工具 【免费下载链接】language-server-protocol Defines a common protocol for language servers. 项目地址: https://gitcode.com/gh_mirrors/la/language-server-protocol 点击查看 免费下载 TextDocumentItem 是 Language Server Protocol(LSP…

2026/10/7 9:58:40 阅读更多 →

最新新闻

基于Qwen3-VL-Embedding-8B的语义文搜图系统实践

基于Qwen3-VL-Embedding-8B的语义文搜图系统实践

1. 为什么选 Qwen3-VL-Embedding-8B 做语义级文搜图1.1 从"标签检索"到"语义检索"先说个很常见的场景。你手头有一批商品图、素材图或者本地相册,想找到"一只橘猫趴在窗台上晒太阳"的图片。如果按老办法,你得先给每张图打…

2026/10/7 11:07:55 阅读更多 →
Agent-Reach 实战:用 CLI 为 AI Agent 构建稳定触达层

Agent-Reach 实战:用 CLI 为 AI Agent 构建稳定触达层

1. 从"Agent-Reach"这个名字说起:它到底想解决什么问题第一次看到 Agent-Reach 这个项目名,我的直觉是它跟"让 AI Agent 够得着东西"有关。Reach 这个词在工程语境里通常有两层意思:一是"触达",二是…

2026/10/7 11:07:55 阅读更多 →
Windows远程文件共享安全加固:从共享权限到SMB协议防护

Windows远程文件共享安全加固:从共享权限到SMB协议防护

做Windows远程文件共享这件事,每年都能碰到一堆翻车现场。最常见的姿势是这样的:右键文件夹 → 属性 → 共享 → 下拉列表选Everyone → 权限改成完全控制 → 确定。然后呢,内网里任何一台机器都能往里写东西,运气差点&#xff0c…

2026/10/7 11:07:55 阅读更多 →
Ubuntu新手生存指南:Shell、文件系统与命令管道底层逻辑

Ubuntu新手生存指南:Shell、文件系统与命令管道底层逻辑

1. 项目概述:这不是一份“教程”,而是一张Ubuntu新手的生存地图你刚装好Ubuntu,桌面看着清爽,图标点得挺顺,但一打开终端,光标在那儿闪——像在等你下命令,又像在嘲笑你手足无措。你搜“ubuntu怎…

2026/10/7 11:07:55 阅读更多 →
物联网断路器设计全解析:硬件架构、通信协议与云端接入实践

物联网断路器设计全解析:硬件架构、通信协议与云端接入实践

简介:针对传统断路器缺乏智能监控与远程控制的问题,这份PDF完整介绍了物联网断路器的设计过程,适合电气自动化、嵌入式开发和智能电网方向的学习者参考。文档从系统总体方案入手,依次讲解传感器模块电路、主控电路、软件程序设计、…

2026/10/7 11:07:55 阅读更多 →
鸡蛋掉落:从朴素DP到最优解的动态规划进阶指南

鸡蛋掉落:从朴素DP到最优解的动态规划进阶指南

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

2026/10/7 11:06:55 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

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

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

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

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

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

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/6 8:21:32 阅读更多 →
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/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练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/6 1:18:13 阅读更多 →