激活路由是不是应该再增加一个{user}参数?

$user = User::where('activation_token', $token)->firstOrFail();
其实我是想问这句代码是不是存在隐患;
如果在概率极低的情况下,出现了两个待激活用户的$token一样,26的10次方分之一,会出现激活到别人账户问题。
概率极其低。这种极低的概率当然在实际上线的应用中无须考虑。
但是不是应该给验证邮箱的路由再增加一个参数{$user},先获得$user,再验证$user->activation_token.
这样是没有了以上极低概率的BUG。
但是又引出一个安全问题,因为$user暴漏在外面了,例如http://....../1/jjjldlldll;
在用户验证之前,是否可以根据这个链接搞些事情呢?
不过考虑不出来能搞什么事情。

好吧,其实以上都是猜测,或许都是不正确的,我还是想问第一句话,只验证$token是不是不严谨的问题?

not only a learner , but also a user .
ruodee
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我大概用计算器帮你算了一下:二十六的七次方等于:8031810176
八十亿呀,你的网站要是有这十分之一都能闷声发大财了。
后面再来三次,几何爆炸。我相信小学时都学过一篇课文。
确实有点不严禁
可以考虑用uuid然后base64编码,就总能是唯一的了

6年前 评论
讨论数量: 5

是的。实际上是应该在生成激活URL的时候,先将用户id和其他参数加密并作为URL的query string,
比如,在生成如下的URL:

http://example.com/email/verify/20?expires...

再点击此URL时,进入控制器相应方法时,再解密验签,如果失败,那么说明此URL已经被篡改,就不能激活成功。这里,教程只是为了简单化说明流程。

5年前 评论

file
截张图娱乐一下,一千七百多万分之一有多难。
所以有人的 token 相同了,记得让他帮你买双色球。

6年前 评论

我大概用计算器帮你算了一下:二十六的七次方等于:8031810176
八十亿呀,你的网站要是有这十分之一都能闷声发大财了。
后面再来三次,几何爆炸。我相信小学时都学过一篇课文。
确实有点不严禁
可以考虑用uuid然后base64编码,就总能是唯一的了

6年前 评论
ruodee

哈哈,谢谢啊。加深印象了

6年前 评论

file
截张图娱乐一下,一千七百多万分之一有多难。
所以有人的 token 相同了,记得让他帮你买双色球。

6年前 评论

是的。实际上是应该在生成激活URL的时候,先将用户id和其他参数加密并作为URL的query string,
比如,在生成如下的URL:

http://example.com/email/verify/20?expires...

再点击此URL时,进入控制器相应方法时,再解密验签,如果失败,那么说明此URL已经被篡改,就不能激活成功。这里,教程只是为了简单化说明流程。

5年前 评论

如果做项目,非常推荐使用 spatie/laravel-url-signer 扩展包来做这类验证。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!