腾讯分分彩组三杀号 > Web分析 >

PHP编程从Web登录限流看Api限流

2018-07-26 01:17

  在网络安全问题日益严峻的今天,登录限流成为防范安全常用的一道屏障。登录限流的目的是防止恶意用户强制登录,通常的做法是,当你尝试登录多次而仍未成功后,系统就会提示你隔断时间再登录,或者弹出验证码输入框让你输入验证码。登录限流的使用增加了强制登录的难度,在一定程度上增强了系统的安全。

  PHP框架Laravel框架原生支持登录限流,当你使用其里面trait组件AuthenticatesUsers实现登录时,系统首先会调用AuthenticatesUsers的validateLogin方法验证你向请求地址传递的参数,其目的主要是验证用户名和密码的格式。如下:

  然后,当参数格式验证完毕后就会判断当前请求的请求次数,看请求次数是否超过允许的最大尝试次数。如下:

  判断请求的次数的原理是获取当前登录的用户名和请求IP,通过PHP加密算法生成一个字符串,如下:

  然后,将这个字符串作为键名去cache缓存中查找对应键值(即请求已经尝试的次数),然后将键值与允许的最大可尝试次数做对比,如果键值大于允许的最大可尝试次数,再判断该请求是否受限,如果受限,则阻断访问,否则重置该请求的请求次数,允许该请求提交登录数据。如下:

  在上面的代码$this->

  attemptLogin($request)这一步中,系统会尝试连接数据库进行登录,如果登录成功,则重置请求次数,否则就如上面一样,利用登录用户名和请求IP,通过PHP加密方法生成一个字符串,将此字符串作为键名(如$key),已尝试的登录次数为键值生成缓存。如果尝试登录的次数大于允许尝试的最大次数,还要利用此用户名和登录IP以及指定的缓存时间生成一个缓存(如$key.:timer),作为限制登录的标识。

  虽然,Laravel框架实现的登录限流针对的是Web页面,但其思想逻辑也可以引入Api接口服务中。

  漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,然后漏桶以一定的速度出水(接口有响应速率),当水流入速度大于流出速度(访问频率超过接口响应速率),水会直接溢出,即拒绝请求。漏桶算法通过强行限制数据的传输速率,来达到限流目的。如下:

  因为漏桶的流出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。

  令牌桶算法(Token Bucket)是一种和 Leaky Bucket 效果一样但方向相反的算法,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。

  令牌桶算法可以方便的改变速度,一旦需要提高速率,则按需提高放入桶中的令牌的速率。一般会定时(比如100毫秒)往桶中增加一定数量的令牌,有些变种算法则实时的计算应该增加的令牌的数量。