短链服务上线两个月,后台多了三万多条记录,目标地址全指向几个陌生域名,日志里同一个 IP 每分钟调八十次生成接口。乍看像缓存或者权限的锅,追下去往往不是。
if (!is_user_logged_in()) { status_header(401); exit; }
$host = parse_url($target, PHP_URL_HOST);
if (!in_array($host, ['example.com'], true)) { status_header(400); exit; }
追下去是这么回事:生成短链的接口没有鉴权,也不校验目标域名,任何人拿到地址就能批量造。短链挂在主域名下,等于用你的域名给别人做跳转背书。
「短链接口鉴权」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,生成接口加登录态或签名校验,匿名请求直接拒绝;目标地址做白名单,只允许站内域名和备案过的合作方;按 IP 和账号限频,超过阈值返回 429;把已生成的可疑短链批量下线,返回 410 而不是跳转。
验收就看一点,未登录调用接口返回 401,陌生域名生成请求被拒,后台短链增长速度回到每天几十条。
