framework icon indicating copy to clipboard operation
framework copied to clipboard

一个thinkphp6 的一个bug,有稳定复现示例

Open hah1346798520 opened this issue 4 years ago • 2 comments

复现示例: 1:下载 https://github.com/hah1346798520/thinkphp6-bug 文件到本地 2:命令行进去tp目录 3:运行 php think run 4:浏览器打开 http://127.0.0.1:8000 5:狂点登录!!!

bug描述:此处点击登录应该稳定返回“验证码错误”,但是有时会返回“令牌数据无效”。

个人调试理解:返回“令牌数据无效”是因为session中无__token__字段,但是调试代码与html页面其实是有token的。 访问浏览器主页后,会同时调用验证码的设置session与token的设置session,这两个的执行先后顺序会影响session中是否有__token__字段。 个人断点调试先后顺序的结果:先运行验证码的设置session,再运行token的正常,反之session中没有__token__字段。

hah1346798520 avatar Sep 18 '20 08:09 hah1346798520

有点像java中的并发修改问题,但是本人不懂php的解决方案

hah1346798520 avatar Sep 18 '20 08:09 hah1346798520

token的目的就是防止重复提交,重复提交的时候,后台还没有返回新的token,拿着两个相同的token去发送请求,必然会出现这个问题,设计如此。应当在前端也添加防止重复提交的代码,一个请求在接收到服务端响应之前,阻止新的提交请求,或者阻止按钮点击

SunJary avatar Dec 29 '21 03:12 SunJary