文件上传漏洞攻防实战:绕过手法与防御加固指南

文件上传,这四个字在Web安全测试里几乎每次深度审计都绕不开。我最近把一套开源的Web漏洞靶场(项目名就叫iwebsec)里的文件上传专题完整过了一遍,从最基础的前端限制到后面的内容检测、解析差异、条件竞争,一层层打下来,最大的感受是:文件上传看似是个小功能,实际的攻防复杂度却可以拉得很高,而多数开发对这个功能的理解还停留在"改改后缀"的层面。

这篇通关笔记不是什么攻击教程。我对每个绕过点的描述都只讲到"为什么能绕"和"怎么防"这一层,真正的目标是让看的人用防御者视角把这些机制重新理解一遍。适合刚接触Web安全的人,也适合后端开发、运维在排查上传模块的时候对照查漏补缺。


1. 关卡概览:文件上传专题到底在讲什么

1.1 文件上传漏洞的核心逻辑

在iwebsec这类靶场里,文件上传专题一般不会给你一张标准答案表,而是像闯关一样,每一关对应一种常见防御姿势。但不管关卡怎么变,核心就一条:网站提供的上传接口接受了一个本不该接受的文件,或者接受了文件,却没有严格限制它接下来会被怎么使用。

我习惯把文件上传的攻击链路拆成三步去看。第一步,攻击者能不能把一个含可执行代码的文件成功传到服务器上;第二步,这个文件落盘之后,服务器环境能不能把它当作代码执行;第三步,即使不能直接执行,是否还能通过其他链路被包含、被加载、被触发。只要三步里有一步成立,上传点就是一个高危点。

这也是为什么专题第一关往往是最简单的前端校验。它本意是拦截所有人的操作,但实际上只拦得住不怎么会用浏览器的人。从这里开始,整个专题其实是在帮你建立一个概念——安全永远不能建立在客户端声明之上。

1.2 我看完一遍之后的整体框架

如果把后续内容用一个框架去概括,可以分成四类。第一类是"文件本身没变,但校验逻辑可以被跳过或篡改",比如前端JS限制、基于Content-Type的校验。第二类是"文件名层面的混淆",比如大小写变形、伪扩展名、特殊字符截断。第三类是"文件内容层面的伪装",比如图片马、文件头伪造、二次渲染绕过。第四类是"服务器或中间件配置层面的组合问题",比如解析规则差异、条件竞争、文件包含联动。

把这四类过完,基本等于把市面上常见的文件上传绕过思路都见了一遍。后面每一章就按这个框架来讲,其中每个技术点我都会同时写清楚它的校验原理和防御启示。这样记录下来的东西,过了几个月再翻,依然能拿来当排查清单用。


2. 细节拆解:靶场里的校验方式为什么会被绕过

2.1 前端JS校验:只防君子不防小人

先看最简单的第一关。前端代码往往会做一个判断:读取input框选择的文件,看看扩展名是不是允许的那几个,不是就弹一个报错。第一次接触的人会觉得功能很完善,但稍微一想就知道,这层检验发生在浏览器里,所有规则都只是"提示用户"级别的。

绕过方式在靶场里演示起来也非常直白。要么直接用浏览器开发者工具临时禁掉那段JS,要么用抓包工具拦截上传请求改掉文件类型字段。更常见的是,直接把上传接口当成普通HTTP接口,构造一个请求包发过去,前端代码根本没机会运行。我在这里用到的工具其实就是一个普通的HTTP抓包调试工具,把上传请求拦截下来,把里面的文件信息改成目标值再放行,整个流程不超过一分钟。

这一关给我的核心启示是:前端校验存在的意义是让正常用户少犯错,不是安全防线。如果开发团队把前端校验当成安全手段,那相当于把系统的大门钥匙放在了门口的脚垫下面。安全性评估必须默认攻击者拥有完整的工具链,不能假设他会老老实实打开页面点击上传。

2.2 MIME类型校验:声明不等于事实

第二类常见的关卡是校验Content-Type。上传文件时HTTP请求头里会带一个Content-Type字段,服务器如果只检查这个字段是不是image/png、image/jpeg之类,那问题就大了,因为这个字段是客户端自己填的,服务端并没有做任何实质验证。

实际测试里,只需要把上传包里对应文件的Content-Type改成允许的图片类型,再配合一个看起来无害的扩展名,就能很轻松地通过这一关。这背后的逻辑在于:Content-Type描述的是发送方声称的媒体类型,而不是文件实际内容。我们可以把它理解成快递包裹上的寄件人标签——标签写"衣服",不代表箱子里真的没有其他东西。

防御场景里,只要记住一条:所有基于"声明"的校验都不可信,校验必须建立在内容本身,以及最终用途上。真实的文件类型应该通过服务端去读取文件二进制特征来判断,比如保存前先用文件类型检测库识别实际格式,而不是信HTTP头里那个谁都可以改的字段。

2.3 黑名单后缀:永远堵不完的口子

再往后会遇到真正带点对抗感的关卡:服务端维护了一个黑名单后缀列表,凡是php、asp、jsp、exe这类危险后缀一律拒绝。粗略一看还挺有效,但问题是,黑名单这种思路天然是"通过枚举坏人来做安全",它永远面对两个难题:枚举不全,以及规则的绕过。

在靶场里我很快就试出了几种方向。第一种是大小写混写,如果服务端逻辑只做简单的字符串比较,很容易漏掉大写后缀。第二种是在文件名尾部加入空格、点这类特殊字符,有些服务端在拼接路径或判断后缀前并没有做标准化处理。第三种是利用多后缀文件名的解析优先级差异,服务端按黑名单判断最后一段,但真正执行代码的中间件可能按第一段或特定组合段来解析。每种方向并不需要多高深的技术,本质上都在利用"判断逻辑和实际使用逻辑不一致"。

这个关卡很值得反复咀嚼。黑名单不是不能用,但必须配合严格的标准化处理,而真正稳妥的做法是转向白名单加白名单校验,允许什么类型就放什么类型,其他的全部拒绝。白名单最大的优势是它能完整枚举,因为你只需要列出来允许的那几个合法类型。


3. 核心通关复盘:从"能传上去"到"能执行"

3.1 协议层校验与文件名变形的组合测试

在靶场里,到后面的关卡往往不会只用一种校验,而是叠加了扩展名校验、MIME校验、简单的头部检查。通关的关键也就变成了做组合测试:先看服务器到底校验了哪些字段,再看这些字段之间存在什么不一致。

比如说,服务端构建最终文件路径时如果同时用到了原始文件名和扩展名,那攻击者就有机会通过精心构造名字制造歧义。这一关我试过在文件名里加入不同后缀组合,观察响应差异,用抓包工具反复修改请求、核对服务端返回,其实整个过程很像在做普通的接口调试,只是多了一个"恶意输入"的视角。

这个阶段的操作步骤是可以被清晰记录的。第一步,拿一个正常图片走完整的上传流程,抓包记录正常的请求结构;第二步,修改请求里的文件名、Content-Type,观察哪些改动会被接受、哪些被拒绝;第三步,根据拒绝规则反推服务端校验逻辑;第四步,针对目标校验项做针对性变形。这套思路不只是在靶场里有用,在授权测试里也完全是通用流程。关键是要有耐心和记录习惯,把每次尝试都留在日志里,不然很容易忘记前一次改了什么。

3.2 文件内容伪装:从文件头到"图片马"

当关卡开始校验文件内容时,游戏就变得有意思了。有些实现的校验只是看一眼文件最前面的几个字节,比如GIF文件会以GIF89a开头,JPEG以特定字节开头。攻击者只需要在合法文件头后面追加内容,就能轻松让它看起来像一张图。

更进一步,还有一种典型的绕过是"图片马":取一张真实图片,在数据末尾追加一小段脚本代码,文件依然能被图片解码器正常打开,但很多解析逻辑会把它当成普通图片放过。在这个关卡里,我实际做的事情是多次尝试不同的图片格式、不同追加位置,看看内容校验逻辑到底校验了多长、是不是只检查前缀。有些环境只读前四个字节,有些则会对文件做简单的格式解析。

对应到防御端,最有效的做法不是增加前缀检查长度,而是重新编码:使用服务端图像处理库把上传文件重新解码再编码一次,所有非图像数据自然会被剥离。这才是真正的内容消毒。如果业务上要求保留原图,宁可多存一份原图,也不要让到达落盘路径的文件绕过内容消毒。

3.3 解析差异:同一份文件在不同环境下命运不同

说到执行,就避不开服务器和中间件的解析规则。同一个文件名,在一个环境里它就是图片,在另一个环境里可能先被某种解析规则匹配为脚本继而执行。这类差异在靶场里经常被设计成一个专门的关卡,考的就是"你知不知道当前环境底下是什么规则"。

我在这一关里做的第一件事,是观察上传目录的URL响应方式,判断当前服务对哪些后缀会走脚本处理,再结合形形色色的文件名组合去探测。这里不需要去记某一套具体的漏洞细节,更重要的是建立一个认知:任何"文件名字和解析器规则之间出现歧义"的情况,都可能变成可执行路径。

防御端对应的措施很明确:上传目录只负责提供静态文件,凡是不该在当前目录当作脚本解析的文件类型都要把它限制死;同时对文件名做统一的随机化重命名,不允许用户控制最终落盘的文件名。这样即便内容本身有异常,执行路径也被切断了。很多人以为配置了上传目录就安全了,其实真正决定文件有没有执行能力的是Web服务器对这一层目录的解释方式。

3.4 条件竞争与组合利用

还有一类关卡会涉及"先保存后校验"或"保存后再扫描"的逻辑。这类实现的漏洞点在于时间窗口:文件已经落到服务器,但还没有被删除或隔离,攻击者如果能在这段时间内发起访问,就可以利用临时文件。这就是条件竞争。

在靶场里复现这个过程需要一点耐心,因为要反复发送上传请求和访问请求去抢时间。和前面的关卡相比,这种利用方式更接近真实攻击中的状态:安全机制存在,但执行顺序留下了缝。解决思路其实也不复杂:先做校验再落盘,而且落盘时用临时文件名,校验通过后再做原子性的改名和移动。

包括文件包含联动也是一样。上传一个图片文件本身并不能被执行,但系统里如果存在一个文件包含点,把图片文件当代码包含进来,攻击链就通了。这提醒我,在做审计的时候不能只看上传模块自己,还要看它和别的模块组合之后会发生什么。单独看每个接口都是正常的,一旦串联起来就变成了完整攻击链。


4. 生产环境加固:打完靶场之后落到工程里的事

4.1 服务端校验写法和白名单原则

在靶场里绕得越多,我越想把防御方案说得直接一点。第一件事永远是:把校验放到服务端,用白名单。白名单判断的不是"哪些后缀危险",而是"哪些类型允许进",其他全部拒绝。

代码层面要做到几件事:扩展名先转小写再提取;校验前把文件名里的路径分隔符、特殊字符去掉;在写存储路径时永远不要直接拼接用户输入。服务端校验时可以顺带用文件类型检测库去检测真实文件类型。这是一个可以在项目里直接落地的写法思路,示例大概长这样:

$allowed = ['jpg', 'png', 'gif']; $origin = trim($_FILES['file']['name']); $ext = strtolower(pathinfo($origin, PATHINFO_EXTENSION)); if (!in_array($ext, $allowed)) { exit('类型不允许'); }

这只是骨架,实际工程里还需要根据项目语言和框架补齐文件大小、文件内容检测等分支,但"先白名单再谈别的"这个顺序不能变。白名单检查之后,再校验文件头、再确认文件大小,最后才进入存储逻辑。

4.2 存储与执行权限隔离

文件校验再完善,也不能保证万无一失,所以第二道防线是存储与执行权限的隔离。上传文件要落到专门目录,这个目录在Web服务器层面要禁止脚本执行。比如Nginx环境里可以加上类似配置:

location /uploads/ { location ~ \.php$ { deny all; } }

同时,文件存储尽量走对象存储或独立文件服务,与应用本身的Web服务拆开。这样即使某个文件意外被传上来了,它也只是一份不会执行的数据,而不是一个有执行能力的代码片段。这个思路放在云环境里同样适用:对象存储本身不会执行脚本,天然就把风险降了一截。

4.3 文件名重写与内容消毒

第三件必做的事是让用户无法控制最终文件名。上传的文件统一改成随机字符串,再通过数据库映射原始名称和展示名称。这样既避免了路径穿越、特殊字符问题,也让很多基于文件名的绕过思路失去目标。随机字符串不要太短,建议直接用随机字节生成的十六进制或哈希值。

对于图片类文件,有条件的话要做内容解码重新编码,这一步能把藏在图片里的多余数据剥离。如果业务上必须保留原始图片字节,至少要在保存前用图像库重新生成一份标准编码。表面上看起来多花了一点服务器资源,实际上换回来的是安全冗余。内容消毒是比后缀校验更本质的安全层,因为大部分绕过技巧最终都要落到"文件里面多出来的那一段数据"上。

4.4 监控告警与安全检查

被动防御之外,还需要有主动的监控。在上传模块里记录几个维度:谁在上传、传了什么文件名、文件大小多少、用什么IP。对异常文件名(包含双重后缀、特殊字符、隐藏后缀、脚本扩展名组合)单独标记告警。如果平台条件允许,可以接一层行为类的防护,对上传后的资源请求做检测,一旦发现图片文件被当成可执行资源请求,立刻触发告警。

安全检查也不能只在开发时做一次,上线前扫一遍、版本更新后补一遍,把上传模块列进常态化安全基线,比出了问题再去复盘要省力得多。我见过不少项目,开发阶段安全测试都通过,结果运维上线时改了上传目录权限,整个防线直接废掉。所以巡检的时候不光看代码,还要看实际运行环境的配置。


5. 易错点排查与学习边界

5.1 我在通关过程中反复踩的几个坑

写这篇笔记之前,我又把专题重新过了一遍,有几个地方非常容易踩坑。第一个是大小写绕过,测试时不能只试一个变体,要把全大写、首字母大写、混合大小写都试一遍,每关的校验实现不同,结果差别很大。第二个是文件头校验,有些关卡只校验前几位字节,绕过时如果只改后缀不改头部内容,会直接被卡住。第三个是扩展名提取,很多代码用简单截断方式取后缀,结果遇到带特殊字符的URL又会出现歧义,排查时要把完整的请求URL和Content-Disposition里的原始值都记录下来。

还有一个很典型的问题:本地测试的时候明明是图片马,到了目标环境却解析不到。原因往往不是绕过思路错了,而是目标环境根本没有对应的解析规则。所以每到一个新环境,先把"哪种后缀会被当作脚本执行"探测清楚,比盲目试payload重要得多。这个习惯在真实排障里特别管用,先确认环境,再分析请求,往往能省掉一大半无效操作。

5.2 一套可以复用的排查流程

我现在帮别人查上传问题时,习惯用这样的流程。第一步,用合法文件走通功能,记录正常请求。第二步,逐个修改文件名、Content-Type、文件内容,观察拒绝行为,建立"什么被接受、什么被拒绝"的对照表。第三步,对拒绝规则做反向推导,确认校验逻辑是服务端实现还是中间件行为。第四步,在确认校验逻辑后,做组合测试,重点看文件名在落盘路径和解析路径里分别是被怎么使用的。第五步,验证结论时要在一个环境内快速确认,不要跨环境乱套经验。

这套流程不需要什么高深的工具,一个抓包工具加一个可重复构造请求的脚本就够了。关键是每一步都要留下记录,不然测到后面容易忘记前面已经试过什么。我在靶场里吃过这个亏,后来老老实实开个表格记录每次测试的后缀、Content-Type、服务端响应,排查效率立刻上来了。

5.3 学习边界:靶场练习与授权边界

最后一定要单独提一句边界问题。iwebsec这种靶场本身就是给训练用的,你可以在里面随便实验。但是把同样的思路拿到真实站点上,性质就完全不同了。所有验证都必须建立在授权范围内,如果不具备授权,那就到靶场里练;如果是在本职工作中做测试,也要先确认范围,再把测试结论反馈给加固动作。

我自己的习惯是:每次通关后优先写防御笔记,而不是保存利用笔记。这个顺序不会变,因为这类知识的真正价值不是拿去做破坏,而是让服务端开发者知道"为什么标准实现是这样的"。想通这一点之后,再看那些五花八门的绕过技巧,其实都是在反复印证一个问题:责任边界在服务端,信任边界必须以服务端为准。


写到这儿其实没有太多需要总结的。文件上传这个专题,在我看来最值得记住的一句话是:安全永远不能建立在客户端声明、黑名单枚举和侥幸的配置上。我打完iwebsec之后干的第一件事,是回自己项目里翻了一遍上传相关的代码,看看有没有踩同款问题,结果还真抓到一个拼路径前没做标准化处理的地方。补完之后再回头看这套靶场,最大的收获反而不是"我绕过了多少关",而是"我知道为什么那条防御规则必须存在了"。这一点,比通关数本身更值钱。

相关新闻

spaCy中文命名实体识别实战:从模型选型到自定义训练与部署

spaCy中文命名实体识别实战:从模型选型到自定义训练与部署

1. 为什么中文命名实体识别我选了 spaCy先交代一下背景。我前阵子接了个文本挖掘的活,要在一批中文资讯里把人名、机构名、地点、时间这些实体抽出来,喂给下游的关联分析。刚开始我没多想,直接拿现成的一套分词工具加规则去搞,结果…

2026/10/19 16:10:58 阅读更多 →
JDBC进阶实战:连接池、事务与批处理的核心原理与工程实践

JDBC进阶实战:连接池、事务与批处理的核心原理与工程实践

看到标题里那个"2",你应该知道这是个延续篇。上一篇我们把手搭在JDBC的门把手上,学会了加载驱动、建立连接、执行一条SQL、把ResultSet里的数据一行行捞出来,最后像个好学生一样把资源一个个close掉。那是入门,是"…

2026/10/19 16:09:56 阅读更多 →
AI视觉图像识别全流程:从数据准备到模型部署的实战指南

AI视觉图像识别全流程:从数据准备到模型部署的实战指南

开门见山说一个很多新手容易误解的点:AI视觉图像识别并不是“拿一张图丢进模型,结果就出来了”那么简单。它背后是一条完整的流水线,从数据采集到模型部署,每个环节都会直接影响最终识别效果。我见过太多人花了大把时间调模型结构…

2026/10/19 16:09:56 阅读更多 →

最新新闻

老毛桃v7.0 UEFI启动盘制作全指南:解决双模式识别失败

老毛桃v7.0 UEFI启动盘制作全指南:解决双模式识别失败

简介:老毛桃U盘启动盘制作工具(UEFI版 装机版)v7.0是一款面向电脑初学者与系统维护人员的轻量级系统辅助工具,专为快速制作兼容UEFI与传统BIOS的U盘启动盘、安装原版Windows系统及执行PE环境下的系统维护任务而设计。资源包共2个文…

2026/10/19 17:00:16 阅读更多 →
open-code-review:面向上下文的代码审查新范式

open-code-review:面向上下文的代码审查新范式

1. “open-code-review”不是工具名,而是一套可落地的代码审查新范式你有没有遇到过这样的场景:团队里刚入职的新人提交了一段看似逻辑通顺的Python函数,用pytest跑全量测试都通过了,但上线后在高并发下偶发空指针——不是语法错误…

2026/10/19 17:00:16 阅读更多 →
open-code-review:基于git diff的轻量级AI代码审查协议

open-code-review:基于git diff的轻量级AI代码审查协议

1. 这不是另一个“AI代码审查工具”,而是一套可落地的开源协作新范式“open-code-review”这个词,最近在技术社区里出现得越来越频繁,但它远不止是“用AI做Code Review”的简单包装。我从去年底开始在三个不同规模的团队里推动类似实践——从…

2026/10/19 17:00:16 阅读更多 →
HCIP H12-221题库高效备考指南:从刷题到掌握核心知识

HCIP H12-221题库高效备考指南:从刷题到掌握核心知识

1. 从一道错题说起:为什么题库不是背答案那么简单很多人拿到HCIP H12-221题库的第一反应是:刷三遍,背熟答案,考试稳过。我带过不少备考的朋友,也见过太多人在这条路上翻车。有个朋友考前模拟稳定在900分以上&#xff0…

2026/10/19 17:00:16 阅读更多 →
老毛桃UEFI装机版v7.0:支持Secure Boot与NVMe的Win11启动盘制作

老毛桃UEFI装机版v7.0:支持Secure Boot与NVMe的Win11启动盘制作

简介:老毛桃U盘启动盘制作工具(UEFI版 装机版)v7.0 是一款面向电脑初学者与系统维护人员的轻量级系统辅助工具,专为快速制作兼容UEFI与传统BIOS的U盘启动盘、安装原版Windows系统及执行PE环境下的系统维护任务而设计。资源包共2个…

2026/10/19 17:00:16 阅读更多 →
2026届毕业生十大AI学术工具全解析:从文献到答辩的实战指南

2026届毕业生十大AI学术工具全解析:从文献到答辩的实战指南

2026届毕业生的论文季比往年来得更早,也更难。一边是毕业设计、实习报告、升学申请材料扎堆,一边是AI工具井喷式更新,很多人不是没得选,而是选择太多不知道怎么搭自己的工具链。我最近帮几个2026届的学生梳理过他们的学术工作流&a…

2026/10/19 16:59:12 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →