吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 942|回复: 0
收起左侧

[讨论] 通过openresty限制访问频率(笔记)

[复制链接]
shyai 发表于 2021-12-10 16:59
local resolver = require "resty.dns.resolver"
local redis = require "resty.redis"

local user_agent = ngx.var.http_user_agent
local rip = ngx.var.remote_addr
local prip = resolver.arpa_str(rip)

local conn = redis:new()   
conn:set_timeout(1000)      
ok, err = conn:connect("10.0.10.111", 6379)  

if not ok then
    ngx.log(ngx.ERR, "failed to connect redis: ", err)
    conn:close()
end

local r, err = resolver:new{nameservers = {"114.114.114.114", "223.5.5.5"}, retrans = 5, timeout = 2000}

if not r then
    ngx.log(ngx.ERR, "failed to instantiate the resolver: ", err)
    return
end

--查询user-agent是否包含指定要限制字符
if ngx.re.match(user_agent, "yyy|xxx","ijo")then
  rds, err = conn:get(rip)
--查询redis里是否包含该ip,1:包含且是非法ip。0:包含且合法
  if rds == "1" then
    ngx.exit(502)
  elseif rds == ngx.null then
--redis值为null,dns查询并记录redis
    local answers, err = r:query(prip, {qtype = r.TYPE_PTR})
        if not answers then
      ngx.say("failed to query the DNS server: ", err)
    end
       
    if answers.errcode then
    ngx.say("server returned error code: ", answers.errcode,": ", answers.errstr)
    conn:set(rip,1)
    end

    for i, ans in ipairs(answers) do
      if ngx.re.match(ans.ptrdname, "(.*)xxx.com", "ijo")then
           conn:set(rip,0)
           ngx.say("OK!!")
        else
           ngx.say("Not OK!")
           conn:set(rip,1)
     end
   end
  end
end

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表