上线前最后一遍:我是怎么靠一张便签纸拦住三次事故的

站长杂谈 25 浏览 0 回复 返回上级

上周帮朋友公司审一个后台系统,他们技术负责人跟我说"都测完了,直接发"。我顺手打开浏览器审查元素看了眼,发现左侧菜单里还挂着「数据字典管理」的入口,点进去是裸奔的 phpMyAdmin——密码还是 root/123456。这要是直接上线,第二天估计就得喜提新闻头条。

回来我就把自己这些年踩过的、见过的、帮人擦屁股擦出来的教训,整理成一张 A4 纸大小的清单。不整那些虚的,就挑最容易在「最后一小时」被漏掉、但一旦漏掉就炸的项。

一、权限:别相信「我测的时候好好的」

我最惨痛的一次,是某个 CMS 的「编辑」角色在测试环境能正常发文,上线后用户反馈「保存按钮灰的」。查了半天,发现测试数据库里编辑角色的权限节点是手动插的,生产环境迁移时那条记录丢了。更坑的是,系统没做权限缺失的降级处理,直接前端把按钮禁用了,用户连报错都看不到。

现在我的习惯是:上线前用最低权限账号完整走一遍核心流程。不是看代码里 role_id 怎么判的,是真的注册一个新号、只给基础角色,点一遍发帖、编辑、删除、审核。权限这玩意儿,代码review一百遍不如低权限账号走一趟。

另外,演示账号和超管的密码必须单独列一项检查。我见过把 admin/admin 写进初始化 SQL 的,也见过演示站忘记关注册导致游客秒变管理员的。现在我的做法是:演示账号密码必须带特殊字符,且和超管密码不同;超管密码在上线前 10 分钟才由负责人手动修改,不改完不让切流量。

二、路由:hidden 的不等于安全的

ThinkPHP 的 `Route::get('test/...')` 这种调试路由,我吃过两次亏。一次是某个 `/api/debug/clear` 清缓存的路由,以为没挂菜单就安全了,结果被爬虫扫到直接触发;另一次是闭包里写了数据库操作,忘记包事务,高并发下把计数器扣成了负数。

现在上线前我会跑一条命令:`php think route:list | grep -i "test\|debug\|temp"`,凡是带这些关键词的,要么删干净,要么加 IP 白名单。还有 ThinkPHP 的 `MISS` 路由和 `__miss__`,必须确认没有兜底到敏感操作上去。

多模块项目更要小心。有次子应用的路由文件里 `url_route_must` 配置和主应用不一致,导致某个接口本来该走完整中间件校验,结果走了简化版,鉴权直接穿帮。

三、菜单:幽灵入口比报错更可怕

菜单和权限节点是两套东西,但很多人混着用。最阴间的 bug 是:菜单显示了,对应的权限节点没注册,或者注册了但控制器方法名改过一个字母。用户点进去,要么白屏,要么报「无权访问」——但这时候前端可能没处理这个状态码,页面卡在一半。

我现在会拉一份「菜单-权限-控制器方法」的三列对照表,用脚本扫一遍:菜单里有的 URL,权限节点表必须有记录;权限节点指向的方法,控制器里必须存在。这个脚本跑完,上次那个「幽灵化半小时」的事故就不会重演。

还有个小细节:如果用了动态菜单(比如按角色从接口拉取的),记得清一遍前端路由缓存。有次 Vue 项目上线后,旧菜单配置还躺在 localStorage 里,用户 F5 刷新才正常,不刷新就能看到本该隐藏的财务模块入口。

四、配置:生产环境的 .env 是最后一道鬼门关

这条老生常谈,但每年都有人中招。我自己的 checklist 里,配置检查拆成三块:

第一是「值对不对」:数据库连接是不是生产地址、Redis 有没有切到持久化实例、OSS 桶名是测试还是正式、CDN 刷新策略有没有开。最隐蔽的是某些第三方服务的沙箱/生产切换,比如支付回调地址、短信模板的签名——测试环境用的是「XX测试」,上线前必须改成正式签名,否则用户收到短信一脸懵。

第二是「文件在不在」:.env 有没有被 .gitignore 漏提交、runtime 目录权限是不是 755、上传目录有没有禁止 PHP 执行。有次项目用 Docker 部署,构建时 .env 是 COPY 进去的,结果本地修改后忘记重新打镜像,线上跑的还是三个月前的配置。

第三是「有没有不该在的」:debug 开关、SQL 日志、报错堆栈显示、接口响应里的服务器版本信息。我现在的做法是写个预发布钩子,检测到 `APP_DEBUG = true` 直接阻断部署。

五、我自己的「便签纸」用法

上面这些不是每次都要完整跑一遍。我的习惯是:项目类型定下来后,把 checklist 打印成实体纸,贴在显示器边框。每完成一项,拿笔划掉。听起来很原始,但物理动作比点个勾更有「仪式感」,也更难跳过。

纸的背面我写了三行红字,是三次事故后自己加的:「演示账号密码改了没」「测试数据清没清」「回滚脚本测过没」。每次划完正面,翻到背面再看一眼,已经成了肌肉记忆。

你们上线前有没有那种「差点漏掉、想起来一身冷汗」的项?欢迎补充,我这张纸还有空白。

评论0
回复 · 0
还没有回复
微信客服 微信客服