文档章节

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

Fundebug
 Fundebug
发布于 2017/09/06 15:27
字数 924
阅读 11
收藏 0
点赞 0
评论 0

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

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

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

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

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

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

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

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

  • 打开我们网站的首页
  • 点击“免费试用“进入注册页面
  • 输入邮箱
  • 输入密码
  • 再次出入密码
  • 点击创建团队
  • 点击创建团队
  • 团队创建成功
  • 报错

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

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

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

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

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

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

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

版权声明:

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

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

© 著作权归作者所有

共有 人打赏支持
Fundebug
粉丝 3
博文 70
码字总数 95391
作品 0
厦门
使用jq的toggle函数实现全选功能遇到的问题

今天做网站后台管理的时候,要实现一个单选全选的功能,很简单的功能,不过,遇到了一个很诡异的问题,写出来跟大家分享下。 功能就不赘述了,大家都懂,最初打算使用jq的toggle函数来绑定两...

保护单身狗协会理事 ⋅ 2013/11/18 ⋅ 0

我的bug人生

上一周工作中遇到了一些不开心的事情,被同事背后捅了刀子,有点郁郁寡欢,我一直认为,我们搞技术的人,心境纯洁,有bug我们改一改,有加班我们就干一干,只要能让自己的程序运行起来,比什...

monster_nian ⋅ 2016/01/25 ⋅ 0

继各种佛系之后,终于出现了佛系程序员

  最近网上疯转的都是   第一批90后已经出家了、入定了、看破红尘了   对佛系青年的看法也褒贬不一   但更多的还是觉得哈哈哈真有意思   这其实只是当下年轻人的一种自嘲   我们...

奋斗在IT ⋅ 2017/12/29 ⋅ 0

【zepto学习笔记01】核心方法$()(补)

前言 在很久之前,我们项目有一个动画功能,功能本身很简单,便是典型的右进左出,并且带动画功能 以当时来说,虽然很简单,但是受限于框架本身的难度,就直接使用了CSS3的方式完成了功能 当...

panpanhtai ⋅ 2014/07/09 ⋅ 0

谁说程序员无趣,明明他们才是真正的段子手!

程序员作为高智商、高收入、高压力群体,经常会有各种自嘲,而且还天生携带段子手基因。不信看看下面这些段子,一般人哪能懂! 1、杀一个程序员不需要用枪,改三次需求就可以了 2、程序员退休...

王练 ⋅ 2017/03/15 ⋅ 7

common-tools(4)之端口映射和SSH tunnel方式连接数据库

如果大家用过一些数据库客户端软件,会发现里面有一项是SSH,可以使用SSH通道来连接到远程主机的数据库,此时我们就可以使用内网IP来直连数据库了。不知道大家有多少是这么用数据库的,我想这...

路小磊 ⋅ 2013/04/21 ⋅ 8

FLEX上使用puremvc的困惑(吐槽)

终于被领导逼着使用puremvc了。我很清楚它的问题所在。 1.通讯机制拙劣:模块间通讯太繁琐,无法定义强类型约束的接口,性能差……2.包装层太多3.用了太多的单例5.代码冗余大6.不好调试 还有...

崔钢 ⋅ 2013/05/21 ⋅ 1

技术的边界

1、 去年,网上流传一则趣闻。 美国圣昆廷州立监狱安排囚犯学习编程,完成学习的犯人出狱后,没有一个人重新犯罪被抓回监狱。 一位刚刚出狱的囚犯说:"太可怕了,我宁愿在外面饿死也不想再进...

阮一峰 ⋅ 2017/03/28 ⋅ 0

Fix Bug的五个阶段

一个非常严重和困难的bug,能够成就一个饱经沧桑深受压力的有经验的专业程序员的职业生涯。经受这种考验的创伤程度,相当你受到了一次严重的身体伤害,离婚,或是家庭成为的离世。 研究人员在...

城邑耕夫 ⋅ 2011/04/23 ⋅ 0

不懂技术,一个好的想法如何让他实现?

经常听到很多人说“我有一个很好的idea”,就差一个技术合伙人了。下面就产品的整个服务流程给不懂技术的创业者分享一下一款好的产品的打造流程。程序员客栈3.0昨日刚刚上线,还是以远程工作...

程序员客栈 ⋅ 2016/04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部