注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

偶有所得,记录在此

有分享交流才有进步,永远不要固步自封

 
 
 

日志

 
 

使用 Redis 解决接口被刷问题  

2011-07-19 12:21:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
问题背景
Web 上,凡是有价值的接口页面、接口,在利益的驱动下,总有被犯罪分子刷的可能;

对方少数几个 IP 还好说,直接封 IP 了事,要是人家有肉鸡,有几千几万的 PC 资源,源源不断,封 IP 即便是自动检测自动封 IP 仍然是显的乏力,被欺负心里很不爽。

解决办法
其实很简单,在处理每个请求前,先检测下这个 IP 是否是恶意攻击的 IP,如果是直接返回个不知所云的页面给对方就好了。

要判断是否是恶意攻击的 IP,我们需要记录每个 IP 每一次请求的时间,如果在 xx 秒内,访问量超过 yy 值,则判定为恶意攻击的 IP。
这里要几个问题:
  • 由于每个接口请求,都要记录下 IP 和 请求时间,这个记录动作必须非常快,不能卡住,否则会影响整个服务。
  • 这些记录的 Log 数据量非常大,但真正对我们有效的也就是最近 xx 秒内的数据,所以要有个机制自动删除无用的记录以节省空间。
  • 判断是否是恶意攻击的 IP 这个逻辑要求有比较高的效率。

采用 Redis 来解决问题
  • 对于每个请求,IP + timestamp 为 Key,在 Redis 里面建立一个计数器;相同 IP 相同时间每访问一次,该计数器加 1
  • 给 Key 设置个有效期,如 5 分钟,5 分钟后,Redis 自动删除过期数据释放空间。
  • 如我们设定,5秒内超过20次,即判定为恶意 IP。对于每个请求,通过 IP + timestamp 取最近的 5 秒所对应 Key 的计数器的值,然后累加,看是否看过限额即可;如果超过限额,则将以该 IP 为 Key,存入 Redis 中,超时设置为 5 分钟,这样就形成了最近被封的 IP 列表。每次请求,都判断当前 IP 是否在这个列表,如果在这个列表,直接封掉。
  • 效率问题,Redis 保证,这个不用担心。
  评论这张
 
阅读(3426)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017