如何防止被恶意刷接口?( 二 )


除非调用者登录到了某一个白名单ip的对应的服务器,这种情况极少,因为一般运维会设置对访问器访问的防火墙 。
当然如果用了Fegin这种走内部域名的方式访问接口,可以不用设置ip白名单,内部域名只有在公司的内部服务器之间访问,外面的用户根本访问不了 。
但对于一些第三方平台的接口 , 他们更多的是通过设置ip白名单的方式保证接口的安全性 。
5 数据加密以前很多接口使用的是HTTP(HyperText Transport Protocol,即超文本传输协议)协议,它用于传输客户端和服务器端的数据 。
虽说HTTP使用很简单也很方便,但却存在以下3个致命问题:
使用明文通讯,内容容易被窃听 。不验证通讯方的真实身份 , 容易遭到伪装 。无法证明报文的完整性,报文很容易被篡改 。为了解决HTTP协议的这些问题,出现了HTTPS协议 。
HTTPS协议是在HTTP协议的基础上,添加了加密机制:
SSL:它是Secure Socket Layer的缩写,表示安全套接层 。TLS:它是Transport Layer Security的缩写,表示传输层安全 。HTTPS = HTTP + 加密 + 认证 + 完整性保护 。
为了安全性考虑,我们的接口如果能使用HTTPS协议 , 尽量少使用HTTP协议 。
如果你访问过一些大厂的网站 , 会发现他们提供的接口 , 都是使用的HTTPS协议 。
6 限流之前提到的发送短信接口,只校验验证码还不够,还需要对用户请求做限流 。
从页面上的验证码,只能限制当前页面的不能重复发短信,但如果用户刷新了页面,也可以重新发短信 。
因此非常有必要在服务端 , 即:发送短信接口做限制 。
我们可以增加一张短信发送表 。
该表包含:id、短信类型、短信内容、手机号、发送时间等字段 。

如何防止被恶意刷接口?

文章插图
图片
有用户发送短信请求过来时:
先查询该手机号最近一次发送短信的记录 如果没有发送过,则发送短信 。如果该手机号已经发送过短信,但发送时间跟当前时间比超过了60秒,则重新发送一条新的短信 。如果发送时间跟当前时间比没超过60秒,则直接提示用户操作太频繁 , 请稍后重试 。这样就能非常有效的防止恶意用户刷短信的行为 。
但还是有漏洞 。
比如:用户知道在60秒以内,是没法重复发短信的 。他有个程序,刚好每隔60秒发一条短信 。
这样1个手机号在一天内可以发:60*24 = 1440 条短信 。
如果他有100个手机号,那么一天也可以刷你很多条短信 。
由此,还需要限制每天同一个手机号可以发的短信次数 。
其实可以用redis来做 。
用户发短信之后,在redis中保存一条记录,key是手机号,value是发短信的次数 , 过期时间是24小时 。
这样在发送短信之前 , 要先查询一下 , 当天发送短信的次数是否超过10次(假设同一个手机号一天最多允许发10条短信) 。
如果超过10次 , 则直接提示用户操作太频繁 , 请稍后重试 。
如果没超过10次 , 则发送短信 , 并且把redis中该手机号对应的value值加1 。
短信发送接口完整的校验流程如下:
如何防止被恶意刷接口?

文章插图
图片
7 监控为了防止被别人恶意刷接口,对接口的调用情况进行监控,是非常有必要的 。
我们的程序中可以将用户的请求记录,打印到相关日志中 。
然后有专门的程序,统计用户接口的调用情况 , 如果发现有突增的流量 , 会自动发短信或者邮件提醒 。
有了监控之后,我们可以及时发现异常的用户请求 。
后面可以进行人工干预处理 。
8 网关为了保证我们接口的安全性,可以提供统一的API网关,它可以实现过滤、鉴权、限流等功能 。
用户请求我们的API接口时,需要先经过API网关,它转发请求到具体的API接口 。
如何防止被恶意刷接口?

文章插图
图片
有了API网关层,可以保护API接口 。




推荐阅读