排序
安全扫描器:五个「扫了但没扫到」的坑,和一个实测确认的路径逃逸
摘要:「扫一遍站点里的 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 被缓...
秘技、限时、自动:三种勋章获取方式,一条授勋通道
三枚成就勋章,三种完全不同的获取方式:秘技(Konami Code)、限时三选一认领、深夜自动授予。交互形态差很远,后端却是同一条通道。本文讲透三种模型各自最容易做错的一处:判定为什么必须在...
「我填了 1 天,它却按 7 天算」:文章过期提示的四个边界
文章过期提示不到 100 行,但有四个边界决定它是好用还是添乱:后台填 1 天代码按 7 天算、颜色值原样拼进 style 属性、提示条跑进 RSS 与编辑预览、以及「刚好满 N 天」算不算过期。文末附零依...
评论反垃圾的四个坑:先被自己拦住、节流伪装失败、空内容归属、与「WP 原生背锅」
给站点加评论反垃圾:敏感词/必含中文/最大字数,命中不拒绝只转待审核。功能不到 100 行,但测试过程有四个坑专门带偏你:管理员先被自己拦住、命令行测试撞上评论节流、空内容落在没想到的规...











