from urllib.parse import urlparse
p = urlparse(next_url)
assert not p.netloc and next_url.startswith('/') and not next_url.startswith('//')

登录成功页读 next 参数做跳转,传 next=https://login-example.cn 直接 302 过去,地址栏前一秒还是自己的域名。这条链接被放进短信里,点击率比正常域名高不少。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:跳转目标没有做同源校验,只要参数非空就 Location 过去。攻击者把真实域名放在前半段,收件人只看开头就点了。跳转还发生在登录之后,用户刚输完密码警惕性最低。

「开放重定向 next」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:只允许站内相对路径 以单个斜杠开头且不含协议;跳转前解析目标 域名必须和当前站点完全一致;不允许 // 开头的协议相对地址;把 next 统一走一个封装方法 业务里不许直接 redirect。

确认没问题再收工,传外部地址时跳回首页 站内 /orders 这类路径照常跳转。

作者 9823189