我的站点遇到一个bug: 第一次登录时,即使输入完整正确,也滑动了验证码,还是会提示:请完成滑块验证; 只有再次输入登录信息才能成功登录。
用了glm-5.1, deepseek 专家版都无法解决,无奈尝试gemini,给到处正确的解决办法。
核心原因在于:Token 的生成逻辑过于“激进”,导致 Session 中的 Token 极易被并发或背景请求篡改。
为什么第一次登录会失败?
背景请求干扰:当你第一次访问 login.php 时,浏览器会同时请求 manifest.json、favicon.ico 或 PWA 的 sw.js。如果你的服务器配置(如 .htaccess)或路由逻辑导致这些不存在的资源请求也指向了 login.php(或者这些资源内部引用了包含 captcha_helper.php 的脚本),generateSliderToken() 就会被再次触发。
Token 被覆盖:Session 中的 slider_token 变成了最新的值,但你当前页面 HTML 表单里填写的还是第一次生成的旧 Token。
校验失败:当你点击登录时,verifySliderCaptcha 发现 $_POST[‘slider_token’](旧)与 $_SESSION[‘slider_token’](新)不一致,直接返回 false,报错“请完成滑块验证”。
第二次成功的原因:
此时浏览器通常已经缓存了背景资源(如图标),不会再触发多余的请求,或者 Session 已经稳定,所以第二次尝试时 Token 能对上。
意见反馈
