为了账号安全,请及时绑定邮箱和手机立即绑定

怎么保证对外暴露接口的安全性(调用频率限制)

怎么保证对外暴露接口的安全性(调用频率限制)

红糖糍粑 2018-10-05 11:39:00
如何限制接口调用者对接口的调用频率?问题:对某个对外暴露的接口加一个限制:调用者一分钟之内调用次数不能超过100次,如果超过100次就直接返回给调用者失败的信息。给调用者一个SECRET,每次调用者需要调用接口的时候,都需要把这个SECRET带过来(为了安全需要对key进行一系列加密的措施)一个SECRET就代表一个调用者,把相应的SECRET的调用次数放入缓存中(必须确保次数增加的原子性),并且把SECRET当做缓存的SECRET(这里如果区分方法的话,可以把方法和KEY做一次加密)。这里主要的难点就是,如何判断调用者1分钟之内调用次数是否超过100?也就是很难确实这个1分钟的开始时间。我现在的想法是:分别把当前秒调用的次数存入缓存。比如说,当前调用者调用次数为3,那么我就往缓存中加入KEY=SECRET_1,VALUE=3;然后调用者在第二秒调用的次数为4,那么就往缓存中加入KEY=SECRET_2,VALUE=3;如此循环,当循环到61秒的时候替换KEY=SECRET_1中得VAALUE,每次调用的时候计算SECRET_1~SECRET_60的值来判断调用次数,是否超过100次。(这里具体一秒钟调用几次,需要通过时间戳来算出是第几秒。这里以60秒为时间周期,并且以秒为一个时间单位,当然如果要求不是很准确的话,时间单位可以调大一点)问题 请问有没有别的更好方法或者想法可以实现这个调用频率的限制?Update:基于令牌桶的开放平台限流框架:limiter,持续开发中...
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

为每个secret维护一个长度为100的队列
当队列长度为100的时候,取出队列头
判断时间是否超过1分钟,则accept
如果不足1分钟则deny
然后shift和push队列即可

查看完整回答
反对 回复 2018-10-14
?
达令说

TA贡献1821条经验 获得超6个赞

nginx的limit_req_zone就符合你想要的这种需求,它是使用令牌桶算法的.具体你可以看一下.

https://img1.sycdn.imooc.com//5bc2f6360001ea2607620500.jpg

查看完整回答
反对 回复 2018-10-14
  • 2 回答
  • 0 关注
  • 1886 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信