2026年10月的文章
安全扫描器:五个「扫了但没扫到」的坑,和一个实测确认的路径逃逸
摘要:「扫一遍站点里的 PHP 文件,看看有没有马」—— 需求一句话,实现也不长:遍历目录、读文件、跑几条正则、列个表。但一个能用的安全扫描器和一段能跑的循环之间,差着五个坑,而它们的共...
WebP 自动转换:三个「上传成功、图片没变」的静默失效
str_replace 路径映射在 CDN/协议不一致时静默失效、能力判定漏了 gd_info、大图不设上限导致上传 500、失败无痕、删原图开关。附零依赖交付代码与 185 项离线单测。
维护模式:五个「看起来在工作、其实开了后门」的写法
X-Forwarded-For 伪造、放行集合漏判、开关读反、200 而非 503,以及'缓存比维护层更早命中'。附零依赖交付代码与 145 项离线单测。
友链申请表单:一次越权写入,和一处「写了但不发」的死角
「友链申请」是每个站都要做的功能:前台表单(游客可填)→ 后台审核 → 通过后写进链接管理器 + 邮件通知。需求很直白,但写对要处理四类互不相同的问题 —— 其中一个是安全漏洞:审批动作只...
文章系列卡片:一个 PHP 8 致命错误,和三处「不报错但白干」的写法
给文章加「系列连载」导航,核心就三步:注册分类法、查同系列文章、在正文里插卡片。但一份「能跑」的实现里通常埋着五个坑,而且五个都不报错:一个平时完全正常、某天突然整页 500(PHP 8 把...
「历史上的今天」为什么永远是空的:三个不报错的死写法,与两个时区坑
一个小到几百行就能写完的功能,我先写了三版,三版都不报错、页面都能打开,只是没效果:in_the_loop() 是恒假的守卫、先取 N 条再过滤让 limit 被吃掉、每次浏览都多查一次库。修完之后,又被...
页面缓存一次都没命中:六个静默失效,与一条 nonce 结构性保证
整页缓存是'一份 HTML 发给所有人',它的失效几乎全是静默的 —— 不报错、页面能开,只是没生效,或者更糟:生效了但内容是错的。本文记录六个静默失效(transient 自杀、0 字节文件、404 被缓...
看板娘不拖慢首屏:六个脚本的串行注入,与三重触发时机
Live2D 看板娘要加载 6 个脚本加模型贴图,直接挂 head 会拖慢首屏。本文讲清两件事:为什么这 6 个脚本必须串行(并行会得到「本地复现不了、线上偶发」的顺序 bug),以及怎么用「事件 + 定时...
秘技、限时、自动:三种勋章获取方式,一条授勋通道
三枚成就勋章,三种完全不同的获取方式:秘技(Konami Code)、限时三选一认领、深夜自动授予。交互形态差很远,后端却是同一条通道。本文讲透三种模型各自最容易做错的一处:判定为什么必须在...









