intro

每一个开发都会写bug,出现bug也不一定是一件坏事.

从每一次写bug的过程中进行总结,都可以让技术水平得到提高.

因为这次发现的bug比较有价值,所以记录了下来.

测试的职责验证正常/异常的逻辑是否正确.

一个好的测试在验证功能的同时,还会review代码是否规范和是否严谨,我很庆幸我身边有几位这样的测试.

对于写出不好看的代码,我是比较讨厌的,会让整个人都觉得不舒服.

我认为每一行代码都应有自己的"灵魂"((⊙v⊙)嗯,太装x了).

所以我写出了很多shit一样的代码…功能上线后再进行重构…所以,这也就是最近这段时间木有发博客的原因.(借口…)

好了好了,扯远了.言归正传

error

产品/运营:我们要有一个抽奖活动,每个用户活动期间只能参加一次.

开发:ok,完成了.

测试:功能验证通过了.

黑客:哇,有bug.大赚一笔美滋滋!!!

process

业务逻辑本身非常简单,所以开发如下:

   if(判断使用户是否参加过抽奖)
   {
   进行抽奖
   记录用户已经抽奖
   }
   else{
   已经抽过
   }

而实际如果都是正常用户的情况下,代码本身看起来好像并没有问题.但是互联网中有一群非常讨厌的人存在,黑客/羊毛党等等.

实际:在高并发并发中这一段代码是有问题的,大量请求可能都进入了未抽过奖的逻辑判断,而导致奖品超发.

修正1:

     if(判断使用户是否参加过抽奖,如果没有抽过,标记用户已经抽取)   
   {
   进行抽奖
   }
   else{
   已经抽过
   }

修正2:

     if(判断使用户是否参加过抽奖)

   {
     if(这次请求是否加锁,如果没有加锁){
       加锁该次请求
       进行抽奖
       记录用户已经抽奖  
     }else{
       领取失败
     }
   }
   else{
   已经抽过
   }

关于加锁我习惯使用REDIS INCR key,返回INCR后的值.

其实在工作的过程中,我发现很多人都有写过这样的bug.只是因为价值不够大,没有特意去说.

嗯,然后听说马蜂窝318有个很给力的活动.然后一个可恶的测试就发现了这个bug,并加以利用.真是可恶啊!!!

imgs

这里再安利一款工具Charles,做客户端的小伙伴应该很常用.其实我也想安利Burpsuite,因为太贵了….买不起

charles

imgs

end

所以以后在开发的过程中,不仅需要关注参数是否正确,请求是否越权,是否存在xss,是否存在sql注入,是否存在任意命令执行,
是否存在超时请求,是否存在并发问题…..

真是可恶啊!!!!!! 人与人之间没有任何信任可言!!!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注