据说拼多多因漏洞被薅了200亿?- 谈谈软件测试

昨天看到一个大新闻:拼多多在20日凌晨出现漏洞,用户能够领100元无门槛优惠券。一晚上之间,被黑产、羊毛党和闻讯而来的吃瓜群众薅了个底朝天,直到次日上午9点才将优惠券下架。网上传言这一波损失超过200亿,但拼多多官方很快回应:漏洞确有此事,但损失没这么多,不到千万,已报警,正在追回程序员

拼多多原本就是家争议颇大的公司,此次事件更是引起舆论热议。听说,这个优惠券本不能正常访问,而是有作黑产(利用互联网不正当牟利)的人挖到了一个漏洞,使得能从某个二维码入口领取到这个券,并把这个券散发出去。你别觉得这是想劫富济贫,他们只是想拉足够的炮灰垫背,同时本身迅速将这个券兑换成话费、Q币等,以此获利。这事情从法律角度来讲算得上“不当得利”,就算涉事帐面金额真的有200亿,大部分也是能够追回的。因此,没吃到瓜的群众别懊悔,反却是真占了便宜的,得考虑考虑了。数据库

话说回来,可能有人要问了,怎么黑产就能弄出一个不存在的优惠券?我不了解具体漏洞细节,但从目前的信息来看,这个券在系统里确定确实存在,有多是内部测试或者某些特定条件下能够领。然而估计程序上并无作更多的领取条件限制,只是隐藏了访问这个券的公开入口。就比如是有人在银行的某个保险柜里放了一笔钱,但没有上锁,以为别人不知道这里藏了钱就没事。后来有人发现了,就把保险柜的位置告诉了全部人,那么每一个人均可以过来拿钱。编程

讲道理,我没上锁也不表明你就能随便拿。但从一个开发者的角度来看,不作必要的权限验证、规则判断,以及特殊状况下的异常处理,仅仅经过隐藏公开入口来限制领取,这是极为低级的失误。让人忍不住想吐槽:拼多多那么有钱,招来的程序员咋这么不专业?并且为何凌晨爆发的问题,到上午9点才封上,下架个优惠券也这么难吗?安全

不过吐槽归吐槽,不能否认的是,软件的 bug、缺陷、漏洞,这是永远不可能杜绝的。被人们看到的漏洞每每很低级,但考虑到软件产品的复杂度,以及开发进度、需求变动等客观状况,漏洞也并非想象中那么容易避免。就在半个月前,知名民宿平台 Airbnb 就爆出过相似的大 bug:当你支付房费的时候,若是切换货币,价格并无跟着变。你能够拿2000越南盾支付原价2000欧元的民宿。在计算机史上,相似的问题数不胜数,举几个知名例子:服务器

  • 1994年,英特尔的奔腾CPU芯片被曝出缺陷:会在精度要求很高的数学计算上出现问题,好比 (4195835/3145727)*3145727-4195835 这样的结果计算出来不为 0。最后英特尔为此付出 4 亿多美圆更换芯片。就在大约一年前,英特尔的另外一个芯片漏洞也波及了市面上绝大多数的电脑、手机和云服务器,这个我去年有文章科普过:关于这波IntelCPU漏洞,我见过最形象易懂的解释
  • 1999年,美国航天局的火星极地登录器在着陆时失联。后经调查认定,故障缘由极可能是一个决定关闭推动器的数据位设置逻辑有误
  • 1991年海湾战争中,美国的爱国者导弹防护系统失效,未能成功拦截导弹致28名美军士兵被炸死。缘由经分析后,是由于系统时钟数据精度不够,存在微小偏差,长时间运行后偏差积累放大,在拦截过程当中可能引发数百米的误差。
  • 千年虫问题:上世纪早期的软件开发者为了节省空间,使用两位数记录年份。然而到2000年时,一些软件仍在使用,使得99年以后变成00年,引起异常。有人估计全球为此花费的相关费用有数亿美圆

由此看来,程序员还真是一个高危职业,一不当心就可能形成巨大损失。若是你没有生产过严重的 bug,多是你运气真的好,但更多是你代码写得还不够多。对此我本身也是很多血泪教训。那面对难以免的 bug,开发者应该怎么办呢?个人建议:函数

一、重视软件测试单元测试

正由于漏洞的广泛存在,以及可能带来的潜在损失,因此软件测试是即为必要的。除了须要有专门的测试人员把关,每一个合格的开发者也应该是一个合格的测试者,正若有句话说的:一个优秀的程序员就是那种即便是过单行道都要往两边看的人(Doug Linder)。对于本身写出的代码,你本身是最了解的人。在开发早期就作好单元测试,能够大大提高程序的稳定性,下降后期测试的成本。当你写的每一个函数都经过单元测试,成为一个功能模块时,再进行集成测试;最后对整个完成的产品进行系统测试测试

企业更是应当重视软件测试的必要性,若是只追求功能快速迭代,拼命赶进度,最后有可能得不偿失。由于 bug 或操做失误致使企业破产的例子也不鲜见。人工智能

测试的方式通常分为黑盒测试白盒测试。上面说的开发者自测通常是白盒测试,即你对代码的实现逻辑是已知的。白盒测试在选取测试用例时,讲究对代码逻辑的覆盖,即你选用的测试数据要能保证让每一行代码每个条件都被执行到,尤为是一些边界条件。而黑盒测试是指不考虑代码逻辑,仅关注程序的功能和输入输出。软件发布测试版让用户使用,就属于一种黑盒测试。在黑盒测试时,讲究对等价类的覆盖,通俗地讲就是覆盖到全部可能发生的状况,包括正常的和不正常的,一样要注意边界。spa

咱们码上行动有个期中项目,就是对教程中“猜数字”游戏的扩展,增长屡次游戏的功能。看似简单的功能,实现起来不难,但几乎大部分同窗提交的代码都会存在必定的缺陷。这就是因为编程新手缺少测试的意识和方法,通常只会按照本身的设想输入,发现结果对了就认为大功告成。其实否则,你得考虑用户若是猜的数字超过范围怎么办?输入了小数怎么办?输入空白怎么办?输入了字符怎么办?……

那测试作到什么程度才到位?我以为知乎上有人分享的一个笑话很到位:

一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,要了一杯洗脚水
一个测试工程师走进一家酒吧,要了一杯蜥蜴
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷
一个测试工程师走进一家酒吧,要了NaN杯Null
1T测试工程师冲进一家酒吧,要了500T啤酒咖啡洗脚水野猫狼牙棒奶茶
1T测试工程师把酒吧拆了
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒而且不付钱
一万个测试工程师在酒吧门外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧
测试工程师们满意地离开了酒吧。而后一名顾客点了一份炒饭,酒吧炸了

via 知乎 @今日飞雪
https://www.zhihu.com/question/20034686/answer/52063718

更多关于测试的知识,欢迎你们找本《软件测试》相关书籍看一看,这个真的颇有必要。

二、相信墨菲定律

墨菲定律:若是你担忧某种状况发生,那么它就更有可能发生。

测试作得再好,也只能是减少 bug 的几率。做为一个开发者,你仍是要认清现实,作好最坏的打算。

  • 若是你要上线新功能,那极可能致使宕机
  • 若是你要更新数据库,那极可能会丢失数据
  • 若是你没有检查备份,那极可能它就恢复不了
  • 若是你搞一个促销活动,那极可能会被羊毛党撸死
  • 若是系统出现了漏洞,那极可能是在半夜
  • ……

但真当你意识到这些绝望的时候,反倒能够提早作好应急预案,将损失限制在最小。若是拼多多在设置出100元无门槛券的时候就至关虎视眈眈的黑产羊毛党,可能事情就不会这样。不过也许如今就是他们的应急预案也说不定呢:控制损失的同时还赚了一大波曝光。世事难料啊!

换个角度,能形成巨大损失也是一种幸运。相比之下,你的产品挂了两天都没人发现,域名过时了都没人跟你抢,那才叫悲惨。因此最后,但愿各位有朝一日都能参与影响巨大的项目,但要有安全意识,千万别捅出大篓子

════

其余文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉 | 字符播放器 | 一图学Python

欢迎搜索及关注公*号:Crossin的编程教室

相关文章
相关标签/搜索