mirror of https://github.com/Safe3/uuWAF
有安科技
4 months ago
2 changed files with 82 additions and 0 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,81 @@
|
||||
--- |
||||
--- Generated by UUSEC(https://www.uusec.com/) |
||||
--- Created by Safe3. |
||||
--- DateTime: 2024/7/25 11:11 |
||||
--- |
||||
local ngx = ngx |
||||
local ngx_exit = ngx.exit |
||||
local ngx_log = ngx.log |
||||
local ngx_err = ngx.ERR |
||||
local ngx_today = ngx.today |
||||
local ngx_kv = ngx.shared |
||||
local http = require("resty.http") |
||||
local ipmatcher = require("resty.ipmatcher") |
||||
local resty_lock = require("resty.lock") |
||||
local util = require("waf.util") |
||||
|
||||
local _M = { |
||||
version = 0.1, |
||||
name = "ip-intelligence" |
||||
} |
||||
|
||||
local matcher, today |
||||
|
||||
local function init_matcher() |
||||
local http_client = http.new() |
||||
local res, err = http_client:request_uri("https://waf.uusec.com/ip-intelligence-feed.json") |
||||
if not res then |
||||
ngx_log(ngx_err, "get ip intelligence failed: ", err) |
||||
return |
||||
end |
||||
res, err = util.jsonDecode(res.body) |
||||
if not res then |
||||
ngx_log(ngx_err, "decode ip intelligence feed failed: ", err) |
||||
return |
||||
end |
||||
matcher = ipmatcher.new_with_value(res) |
||||
end |
||||
|
||||
function _M.req_post_filter(waf) |
||||
local lock, err, ok |
||||
|
||||
if (not today) or today ~= ngx_today() then |
||||
matcher = nil |
||||
today = ngx_today() |
||||
end |
||||
|
||||
if not matcher then |
||||
lock, err = resty_lock:new("lock") |
||||
if not lock then |
||||
ngx_log(ngx_err, "create ip_threat_lock failed: ", err) |
||||
return nil |
||||
end |
||||
|
||||
ok, err = lock:lock("ip_threat_lock") |
||||
if not ok then |
||||
return |
||||
end |
||||
|
||||
if not matcher then |
||||
init_matcher() |
||||
end |
||||
|
||||
ok, err = lock:unlock() |
||||
if not ok then |
||||
ngx_log(ngx_err, "unlock ip_threat_lock failed: ", err) |
||||
end |
||||
end |
||||
|
||||
if matcher then |
||||
local level = matcher:match(waf.ip) |
||||
if level then |
||||
waf.msg = "ip threat level: " .. level |
||||
waf.rule_id = 10000 |
||||
waf.deny = true |
||||
ngx_kv.ipBlock:incr(waf.ip, 1, 0) |
||||
return ngx_exit(403) |
||||
end |
||||
end |
||||
end |
||||
|
||||
return _M |
Loading…
Reference in new issue