如何防止系统被刷接口?
相信身为程序员的我们,在7-8年前智能手机还没有普及的时候,那个时间QQ以及玩的很多游戏都是有VIP或各种特权的,大多数人应该都有了解或者听说过刷这个字。
刷的原理就是我们发送短信或者请求后,利用程序的响应时间,事务处理结果以及网络传输延迟,中间这个差值做事情。细节不在此说,大概意思理解就好。
随着互联网的发展,分布式系统的普及,系统的安全健壮让这些漏洞变得不再可用。
再举个例子,假设我们有一个积分签到系统,接收到一个请求就对这个请求参数代表的用户进行增加积分。如果我们不对接口的业务做处理,该漏洞就会被不良用心的人刷取积分。(假如哈,假如,现在应该不会有这种写法了吧,这种都属于业务的限制了,有的话该问问自己了😂)
在这种需要进行限制的接口中,常用的做法有时间限制(业务需要,每天签到一次),或者次数限制(只可点击5次),在或者2分钟内只能点击1次这种限制。这些措施都是接口的业务处理,那么今天我们就来看下如何让这些非法请求连业务处理逻辑这一步都进不来呢?
被程序自动化的恶意多次请求会给服务器带来巨大的负载压力,甚至导致系统崩溃,影响正常用户的使用。
首先还是看下防止接口被恶意刷的8种方式。
1.防火墙
防火墙也是互联网安全攻防中重要的屏障,我们通过配置访问规则,可以限制只有被允许的IP才可以进行访问。
防火墙还可以识别和阻止DDoS攻击,通过识别并过滤恶意流量请求,防火墙可以有效的防御,保护接口正常运行。
2.用户认证
在调用接口之后,需要对接口中的身份信息进行认证和授权,只有授权过的合法用户才可继续访问。
常用的有OAtuh2.0等标准协议,通过token的形式进行身份验证,确保用户已经登陆或者已经具备该接口的访问权限,从而限制接口的访问。
我们可以自定义一个注解,在注解上添加权限授权标识,并在网关上增加权限拦截器,对增加了该权限注解的接口进行权限验证,只有匹配该接口所需要的权限才可以访问。
3.访问频率
增加访问频率限制,限制同一个用户在一段时间内的请求接口次数。我们可以根据用户角色的不同设置不同的等级限制。
访问频率这块我们可以都适用动态配置的,可以考虑一下两点方向:
- 访问策略限制可以配置调整。
- 限制算法与业务影响最小,既能有效防止恶意请求,也不影响正常用户访问。
4.验证码
比如登陆时用的短信验证码,页面限制60秒发送一次,大大延长用户操作的时间,但是当用户刷新了页面,对于当前页面来说,用户还是可以继续点击发送短信验证码,所以服务端我们也要做访问限制。
当请求进来后,以用户手机号为key,判断最近发送验证码的时间,如果大于60s,就发送短信,反之拒绝。
服务端做限制,以手机号发送验证码举例,不仅要限制发送验证的频率,还要限制每天同一个手机号最多发送几次验证码。
以用户手机号以及当天日期为key,增加当天该手机号发送验证码次数,超过一定次数拒绝发送短信。
5.IP 白名单与黑名单
对于信任的IP地址直接加入白名单,对于明确知道恶意请求的 IP,直接加入黑名单。(如何知道是恶意请求,就是下一个手段,监控)
白名单黑名单的配置我们可以使用配置中心,Nacos 或者 Apollo,这样当线上使用时可以动态的增加删除,使其动态生效。
6.监控
在系统中增加监控系统,对接口的请求记录保存日志,通过对日志进行分析,发现突发流量时使用限制访问频率或者封禁IP等手段,然后同步发送短信或者邮件提醒管理员。
监控的范围最好是覆盖广,相当于全接口的监控,然后是实时、准确,最好有可视化的监控报告,帮助管理员或者运维人员排查。
7.数据加密
为何能自动化的使用程序刷接口,就是因为通过各种手段破解了我们接口所需要的参数以及认证信息,那么我们对接口进行加密就可以增加这个过程的难度,让其再去破译该接口就变的没有那么容易。
加密有多种,首先可以数据加密,也就是传的参数,前后端约定加密算法。然后是使用HTTPS安全传输协议,对接口传输的数据进行加密,防止数据被中间人窃取篡改,保证接口安全。
8.用户行为分析
在监控系统的基础上,增加用户分析,对用户的特点行为进行分析,发现异常行为时作出相应的处理。但是需要确保不能影响到正常的用户,也不能使用单一的条件进行分析,需要多方位的,比如用户的登录设备、IP、时间点等。
总结
上文描述了8中防止接口被刷的方式,其实看下来你会发现,不管是哪一种,最后的目标就是不要让恶意请求访问到我们业务的接口。其实还有一种,接口的幂等,但是这种就会造成服务器的负载压力,对用户的数据行为是不会造成影响的,相当于资源浪费了,所以也不是那么可取,下一篇我们就来聊一下MQ中消息重复消费之幂等消费。