如何做ip限制

2021-08-30 19:13:03 字數 2257 閱讀 1407

最近又需要做乙個簡單的ip訪問限制。這一次經別人提醒,學到了另外一種方法去實現。這次是用memcache實現的。

需求

實現方法1:python + memcache

原理: 分析條件就是要知道這個ip在哪段時間內?當前的訪問次數是多少?

準備工作是安裝memcache和python的客戶端

思路:把ip作為key,把乙個unix時間戳和這個ip的訪問次數用'-'分隔符一起作為value, set到memcache中。 當乙個新的ip位址來的時候先set,然後如果這個ip位址不是第一次來的話,就要判斷做3個邏輯。

以下是實現**:

import memcache

def ip_limit(ip):

'''

return true if need to limit ip, otherwise return false

'''sep = '-'

mc = memcache.client(['127.0.0.1:11211'], debug=0)

now = int(time.time())

value = mc.get(ip)

if not value:

#set this ip the first time to access

#format is time-count

v = '%s%s%s' % (str(now), sep, '1')

mc.set(ip, v)

return false

else:

#last_access_time and access_times is string

value_list = value.split(sep)

#now last_access_time and access_times is int

last_access_time, access_times = int(value_list[0]), int(value_list[1])

if (now - last_access_time) <= config.ip_cold_time and access_times >= config.ip_max_access_times:

return true

elif (now - last_access_time) <= config.ip_cold_time:

access_times += 1

mc.set(ip, '%s%s%s' % (str(last_access_time), sep, str(access_times)))

return false

else:

mc.set(ip, '%s%s%s' % (str(now), sep, '1'))

return false

**裡面的config是乙個config.py檔案,用配置的方式配置多長時間(單位:秒)ip_cold_time 和 要限制的訪問次數

ip_max_access_times, 方便隨時可以修改。

實現方法2: 用python+資料庫mysql

具體: 建立一張ip表,表結構很簡單:ip_table(ip, varchar 20, access_time int)

查詢有沒有在單位時間內超過限制次數的邏輯大概如下:

def limit_ip(ip, now):

"""

return true if need to limit ip,otherwise return false

@ip: ip address that is '***.***.***.***'

@now: unix time, int

"""sql = """select count(*) as times from ip_table where ip = %s and access_time > %s and access_time < %s"""

access_times = conn.query(sql, (ip, now - config.ip_cold_time, now))[0]["times"]

if access_times < config.ip_max_access_times and access_times >= 0:

return false

return true

插入ip就很簡單了,直接insert就可以 了。

歡迎有其他ip限制方法的分享和有經驗的童鞋拍磚!

如何做研究

來自 在研究生期間,一開始大家都很迷惑,都不知道自己要幹什麼 該幹什麼?即便知道自己要幹什麼,也不知道從哪幹起?上次兩位老師跟我們交流了一下,下面是他們的心得 給乙個專案 解決方案 問題分塊 任務明細 一開始並不是所有的問題都會想到,但是起碼要有乙個大體的框架在心中,然後細化模組,對每乙個功能進行細...

如何做專案

1,以業務規則為綱,而不是業務實體 2,在思考和設計業務規則的時候,以業務核心為綱,什麼是業務核心,定義為,當前你最關注的,當前最不確定的那一部分。所以我現在不喜歡領域驅動,我喜歡業務驅動 其實可能二者是一碼事 那麼我這裡所說的業務驅動要怎麼驅動法呢?就先以上面兩條為起頭,然後再來說,業務規則,以找...

nginx如何做訪問限制和訪問控制詳解!

啟動請求頻率限制 limit req zone binary remote addr zone req zone 10m rate 1r s 限制請求 二進位制位址 限制策略的名稱占用10m空間 允許每秒1次請求 重啟服務並測試,這時候你會發現,如果你在一秒內做多次操作那就會彈出錯誤。1.基於主機 ...