大家好,我是爱搞知识的咸虾米, 今天这一期做了一次标题党, 我人没有被打,是我使用uniCloud开发的开源接口被打了,被频繁恶刷了, 这一期就给大家介绍 一下,我是如何发现这个恶刷者的, 然后又是怎么一步一步被逼着改造的。

【做开源,被打了】完整视频

在这里插入图片描述

首页来介绍一下这个项目,这是一款名叫巷子深的微信小程序项目,我录制了详细免费的学习教程,提供了项目中所需要的所有接口对接文档,接口是使用uniCloud云函数的URL化完成的。
在这里插入图片描述

调用量和读写量的额度,是完全可以支撑正常学习时候调用需求的,但是近两个月总有同学留言或者私信说接口不能用了,我就开始看日志,不看不知道,一看日志吓一跳,一天时间竟然刷了1万多次接口请求,把额度一天给耗尽,所以导致有些同学无法正常调用,至此我就开始了和恶刷者的斗智斗勇。
在这里插入图片描述

第一步

先保证正在学习的同学有接口能用,不影响开发学习,所以赶紧上线了备用mock版本的接口,这个接口是使用fastmock开发的,这样正在学习的同学,只需要改个基础网址就能保证接口继续调用,这个也已经录制出了课程FastMock快速模拟真实的API接口,感兴趣的同学可以去看一下,有详细的使用步骤。
在这里插入图片描述

第二步

筛选出有哪些IP在恶刷,统计出正常用户一天请求接口多少次,在代码中可以看到我将调用我接口的IP全部存到数据表中,从1000多个用户请求找到规律,一般用户一天基本就会调用100次左右
但是这个来自湖南的IP,几天时间,一个接口被调用5000多次。我的办法是控制调用频率,2秒钟可以调用一次,经过几天的观察发现调用次数减少了,貌似他发现了我的规则,所以从原来的1秒钟好几次变成了3秒钟左右调用一次。

const clientInfo = this.getClientInfo();		
let {clientIP} = clientInfo;		
let ipRes = await dbJQL.collection("custom-ip-time").where(`ip=='${clientIP}'`).orderBy("create_date","desc").get({getOne:true});		
let createData = Date.now();
if(ipRes.data && ipRes.data.ip){				
	if(createData - ipRes.data.create_date<2000){
		throw result(400,"time");
	}else{		
		await db.collection("custom-ip-time")
		.where({
			ip:clientIP
		}).update({
			create_date:createData,
			count:dbCmd.inc(1)
		})
	}			
}else{
	await dbJQL.collection("custom-ip-time").add({
		ip:clientIP,
		count:1
	})
}

第三步

从以上的统计基本就可以断言,这绝对不是一个正常使用者,所以直接在程序里面完全禁掉这个IP,我想拿不到有用的数据了,你应该会放弃了吧,上线后第二天我傻眼了,他竟然刷了我4万多次,看来是我一不小心惹大哥生气了,在打击报复我,我咨询了一些朋友,他们给我建议如果受到DDoS攻击是可以报警的,只是我的调用次数太少,没有造成经济损失是没有必要的。
在这里插入图片描述

第四步

开始找文档想方案,官方文档说可以开通redis,可以设置IP黑名单,然后花了19块钱开通了redis,请教了我们公司的Java大佬,教会我使用redis,对原来的接口进行了优化,让原来响应100毫秒的接口,迅速2毫秒获得响应,想要学习这方面课程的同学,可以把想学打在弹幕上,通过redis也设置了黑名单,也限制了每个IP的访问次数,以为大获全胜了那,结果恶刷的大哥还在锲而不舍的刷我。
在这里插入图片描述

第五步

该做的都做了该防的也防了,解决不了只能向官方大佬请教了,没想到在dcloud社区还有人认识我咸虾米,同样他也遇到了一样的问题。最后官方答案是,因为dcloud团队无法介入到阿里云的网关层,
所以目前redis也无法完全阻止恶刷者消耗云函数的调用次数,dcloud开发团队处理很迅速,我也帮助官方发现了问题,官方也迅速做出了修复,也让后来的开发者少走弯路,我在帖子下面也回复了处理方案,希望能够帮助到需要的同学。
在这里插入图片描述

最后,不知道是我的防护起到了作用,还是大哥对我接口失去了兴趣,或者说一开始他就是一个爱学习的同学,只是调用次数有点多让我产生了误判,从日志看调用次数已经回归了正常,如果再出现新的后续,我将会继续更新,同时提醒大家DDoS攻击是犯法的,不要轻易去尝试攻击别人,否则很有可能会被抓。
在这里插入图片描述

一开始发现这个恶刷者的时候,我对他各种恶语相向,后来发现是这位其实是个大好人呀,他推动我在学习在进步,如果没有他的恶刷,可能我都不会去考虑这方面的问题,有了这个事件以后,一方面告诉大家开发项目,一定要有常看日志排查问题的习惯。另一方面发现问题,尽自己所能的去找解决方案,说不定又能发现新大陆,这个redis就是我的意外收获。
在这里插入图片描述

好啦,本期就给大家分享这么多,如果课程对你有所帮助请给点个赞,感谢大家的支持,我是咸虾米,我们下一期再见。

【做开源,被打了】完整视频

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐