资讯专栏INFORMATION COLUMN

我是这样搞懂一个神奇的BUG

J4ck_Chan / 672人阅读

摘要:但是,不应该啊我们是事先有做检查的。一个请求成功返回,表示账户创建成功。自从年双十一正式上线,累计处理了亿错误事件,付费客户有阳光保险核桃编程荔枝掌门对微脉青团社等众多知名企业。

摘要: 通过分析用户的行为,才想得到为什么会出现这种情况!

前两天在BearyChat收到这样的一个报警消息:

409Conflict ? 平时很少遇到这样的错误,貌似很严重的样子,吓得我赶紧查看到底发生了什么。

仔细查看错误详情发现是因为使用同一个邮箱账号多次注册导致后面的请求数据库直接报错。

但是,不应该啊!我们是事先有做检查的。如果该邮箱已经被注册,会提醒并且不让注册的。难道对方是个黑客,直接调用API发请求?如果是这样那就更加危险了,我们已经被黑客盯上了!

可是这样做对黑客也没什么好处啊,并且IP显示为国内地址,如果真的是黑客好歹用国外的地址吧。想了想,还是仔细分析到底出了什么问题吧。

再往下一看,发现自己完全是多想了。如果是黑客的话,下面的用户行为就把他给完全暴露了!

这些用户行为记录默认按照倒序排列,我们可以从下往上一条条看用户的使用轨迹。通过用户行为可以得知出错前的整个操作流程:

打开我们网站的首页

点击“免费试用“进入注册页面

输入邮箱

输入密码

再次出入密码

点击创建团队

点击创建团队

团队创建成功

报错

那么问题来了:有没有什么异常的行为?
答:有!他点击了创建团队两次。

凭着我敏锐的嗅觉意识到可能是由于用户快速点击"创建团队"按钮两次导致。通过时间记录发现第一次点击是在1.86m,第二次在1.87m。也就是说:用户在很短的时间内快速点击了两次。

刚刚的用户行为记录过滤了网络请求,接下里我们结合网络请求一起分析:

可以发现有两个/members/email的GET请求,并且都成功返回404,这里代码的意思是指该邮箱尚未被注册,可以被使用。一个/members/create请求成功返回200,表示账户创建成功。最后报错的/members/create请求失败返回409。

到这里基本确定出错原因就是由于用户快速点击创建团队导致。
有没有这种可能呢,尝试复现一下看看呗!于是,我打开了注册页面,输入邮箱和密码,然后以超快的手速点击创建团队N次。哈哈哈哈,不出所料,被我成功复现了!

只要能够成功复现,这个BUG基本上就算被解决了,接下来就是去分析如何优化代码防止出现这种情况了。有两个思路:1. 用户点击之后,设置被点击的按钮无效直到点击请求完全被处理;2. 将验证邮箱是否存在的和创建团队两个异步事件想办法合并为一个原子操作。综合考虑,决定使用第一种方案。因为实现简单,对现有代码改动不大。

总的来说:当在没有堆栈信息或者报错信息难以理解的时候,Fundebug记录的用户行为真的很有用。五星推荐前端开发接入到项目中!

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有阳光保险、核桃编程、荔枝FM、掌门1对1、微脉、青团社等众多知名企业。欢迎大家免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2017/09/06/fundebug-user-behavior-help-debug/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91796.html

相关文章

  • 搞懂JavaScript引擎运行原理

    摘要:同步一次执行一件事,同步引擎一次只执行一行,是同步的。调用函数将其推入堆栈并从函数返回将其弹出堆栈。执行上下文当函数放入到调用堆栈时由创建的环境。执行结果它会立即被推到回调队列,但它仍然会等待调用堆栈为空才会执行。 为了保证可读性,本文采用意译而非直译。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 一些名词 JS引擎 — 一个读取代码并运行的引擎,没有单一的J...

    lastSeries 评论0 收藏0
  • 一次性搞懂JavaScript正则表达式之引擎

    摘要:总的来说,可以称为文本主导的正则引擎,可以称为表达式主导的正则引擎。首先,正则表达式在计算机看来只是一串符号,正则引擎首先肯定要解析它。精通正则表达式书中说引擎不支持非贪婪模式,很明显不是引擎。正则表达式中可以商榷的部分就叫做备选状态。 本文是『horseshoe·Regex专题』系列文章之一,后续会有更多专题推出GitHub地址:https://github.com/veedrin/...

    hlcc 评论0 收藏0
  • 4 个 useState Hook 示例

    摘要:示例使用显示隐藏组件这个示例是一个组件,它显示一些文本,并在末尾显示一个链接,当单击链接时,它展开剩下的文本。还有一个处理提交的函数,其中,来阻止页面刷新并打印出表单值。它使用传递一个对象,为了确保现有的状态不被覆盖,这里使用了展开运算。 为了保证的可读性,本文采用意译而非直译。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 到 React 16.8 目前为止,...

    ZweiZhao 评论0 收藏0
  • 狗子哥虽然失业了,但是生活才刚刚开始啊

    摘要:失业的两周真的也是爽啊,每天打打球,去面试面试,当作逛街。为什么走我一定是疯了,我才辞职的吧。我一直觉得工作是自己喜欢,不是因为生活所迫。钱,只是说能力的体现。但是不忘初心,善始善终,生活才刚刚开始啊。。。  失业的第二周,一边玩的很开心一边又担心工作,一边投简历一边面试,一边嫌弃厂太小不想去,一边大厂又没有消息,纠结纠结。   从大一暑假边上课边工作到后来全职工作,其中寒暑假无休,毕业跟实...

    snifes 评论0 收藏0
  • 业务开发中调试方法总结

    摘要:业务开发中的调试方法总结这段时间,接触了单元测试,同时业务中遇到了一些需要排错调试的情况,就把自己的经验做个小结。但是如果你的业务经常变化,但是变化的部分并不会影响单元测试,那这种情况下的单元测试性价比就很高。 业务开发中的调试方法总结 这段时间,接触了单元测试,同时业务中遇到了一些需要排错调试的情况,就把自己的经验做个小结。 3种调试方法 狼叔说,常见的三种调试的境界 初级: 打l...

    KaltZK 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<