orange(3)插件功能分析(property

property_rate_limiting 防刷插件

1 nginx 【init phase】

1.1 配置插件优先级1000

PropertyRateLimitingHandler.PRIORITY = 1000

注意:priority值越大优先级越高,针对相同phase阶段内的插件生效。

1.2 重写access函数

插件处于【access phase】阶段

2 此插件的处理逻辑

通过 提取器extractor从以下对象中提取关键参数项

  • Query
  • Header
  • Cookie
  • PostParams
  • Host
  • URI
  • IP
  • Method

用于标记请求,并为此请求记录访问次数,当具有某些特征的请求达到单位时间内访问次数限制的时候,既直接返回429(访问次数太多)应答,不再转发请求到后端服务。

注意:此插件的功能就在于标记请求,限制各个被标记请求单位时间(秒,分钟,小时,天)的访问次数;关键点就是此插件并不是达到访问次数限制后,整个接口都限制,只是限制具有某些特征参数的接口请求。

场景:结合公司saas业务,不同商家的前端访问域名相同,通过不同的flag来来区分商家,可以将此flag作为关键参数标记不同商家的访问请求,进而限制单位时间内的访问速率,如一分钟内访问接口不超过10次,一天访问总次数不超过5000次。

3 dashboard配置

3.1 启用 property_rate_limiting插件

orange(3)插件功能分析(property_rate_limiting)


3.2 创建选择器,选择“自定义流量”


尽量不要用“全流量”,相率更高一些

orange(3)插件功能分析(property_rate_limiting)

3.3 提取 flag请求参数来标记请求

限制访问频率为1分钟内10次,超过则返回 429。

orange(3)插件功能分析(property_rate_limiting)

orange(3)插件功能分析(property_rate_limiting)


4 代码逻辑

  • nginx.conf 配置文件中 http节,指定 lua_shared_dict property_rate_limiting 10M空间,用来本地存放记录请求访问次数。
  • extractor提取的参数作为key,次数作为value存储在property_rate_limiting中,在首次设置值的同时会指定过期时间,过期时间根据频率限制的秒,分钟,小时,还是天来区分,首次设置次数值的时候指定expire过期时间,之后则是更新。时间到了下一个周期时,会从新设定,上一个周期的值会因为过期自动被清理掉。


分享到:


相關文章: