nginx lua指令碼 限制訪問

2021-08-14 06:31:20 字數 3440 閱讀 9265

local redis = require 'resty.redis'

local cache = redis.new()

local ok ,err = cache.connect(cache,'127.0.0.1','6379')

cache:set_timeout(60000)

-- 如果連線失敗,跳轉到label處

if not ok then

goto label

end-- 白名單

is_white ,err = cache:sismember('whitelist',ngx.var.remote_addr)

if is_white == 1 then

goto label

end-- 黑名單

res , err = cache:expire('ip_forum_edittopic:' .. ngx.var.remote_addr, 43200) -- 12h重置

endis_forum_ban , err = cache:get('ip_forum_edittopic:' .. ngx.var.remote_addr)

if tonumber(is_forum_ban) > 80 then

local source = ngx.encode_base64(ngx.var.scheme .. '://' ..

ngx.var.host .. ':' .. ngx.var.server_port .. ngx.var.request_uri)

local dest = '' .. '?continue=' .. source

ngx.redirect(dest,302)

goto label

else

res , err = cache:incr('ip_forum_edittopic:' .. ngx.var.remote_addr)

end-- ip訪問頻率時間段

ip_time_out = 60

-- ip訪問頻率計數最大值

connect_count = 45

-- 60s內達到45次就ban

-- 封禁ip時間(加入突曲線增長演算法)

ip_ban_time, err = cache:get('ip_ban_time:' .. ngx.var.remote_addr)

if ip_ban_time == ngx.null then

ip_ban_time = 300

res , err = cache:set('ip_ban_time:' .. ngx.var.remote_addr, ip_ban_time)

res , err = cache:expire('ip_ban_time:' .. ngx.var.remote_addr, 43200) -- 12h重置

end-- 查詢ip是否在封禁時間段內,若在則跳轉到驗證碼頁面

is_ban , err = cache:get('ban:' .. ngx.var.remote_addr)

if tonumber(is_ban) == 1 then

-- source攜帶了之前使用者請求的位址資訊,方便驗證成功後返回原使用者請求位址

local source = ngx.encode_base64(ngx.var.scheme .. '://' ..

ngx.var.host .. ':' .. ngx.var.server_port .. ngx.var.request_uri)

local dest = '' .. '?continue=' .. source

ngx.redirect(dest,302)

goto label

end-- ip記錄時間key

start_time , err = cache:get('time:' .. ngx.var.remote_addr)

-- ip計數key

ip_count , err = cache:get('count:' .. ngx.var.remote_addr)

-- 如果ip記錄時間的key不存在或者當前時間減去ip記錄時間大於指定時間間隔,則重置時間key和計數key

-- 如果當前時間減去ip記錄時間小於指定時間間隔,則ip計數+1,

-- 並且ip計數大於指定ip訪問頻率,則設定ip的封禁key為1,同時設定封禁key的過期時間為封禁ip時間

if start_time == ngx.null or os.time() - tonumber(start_time) > ip_time_out then

res , err = cache:set('time:' .. ngx.var.remote_addr , os.time())

res , err = cache:set('count:' .. ngx.var.remote_addr , 1)

else

ip_count = ip_count + 1

res , err = cache:incr('count:' .. ngx.var.remote_addr)

-- 統計當日訪問ip集合

res , err = cache:sadd('statistic_total_ip:' .. os.date('%x'), ngx.var.remote_addr)

if ip_count >= connect_count then

res , err = cache:set('ban:' .. ngx.var.remote_addr , 1)

res , err = cache:expire('ban:' .. ngx.var.remote_addr , ip_ban_time)

res , err = cache:incrby('ip_ban_time:' .. ngx.var.remote_addr, ip_ban_time)

-- 統計當日遮蔽ip總數

res , err = cache:sadd('statistic_ban_ip:' .. os.date('%x'), ngx.var.remote_addr)

endend::label::

local ok , err = cache:close()

Python訪問限制

我們可以給乙個例項繫結很多屬性,如果有些屬性不希望被外部訪問到怎麼辦?python對屬性許可權的控制是通過屬性名來實現的,如果乙個屬性由雙下劃線開頭 該屬性就無法被外部訪問。看例子 class person object def init self,name self.name name self....

Swift 訪問限制

在swift語言中,訪問修飾符有三種,分別為private,internal和public。swift對於訪問許可權的控制,不是基於類的,而是基於檔案的。其區別如下 1.private private訪問級別 所修飾的屬性或者方法 只能在當前的 swift原始檔裡 可以訪問。2.internal 預...

Nginx 訪問限制

http部分配置limit conn status 404 通過 漏桶 演算法限制每個 ip 發起的請求頻率。limit req zone binary remote addr zone sym 10m rate 30r m 限制每個 ip 發起的連線數。limit conn zone binary...