簡體   English   中英

如何使用基於PHP / MySQL的腳本禁止網站上的IP塊?

[英]How do I use a PHP/MySQL-based script to ban IP blocks from a website?

我有一個相當大的IP和IP塊列表,我想禁止它。 我所擁有的列表是以塊的形式完成的,目前采用以下格式:

1.2.3.4-1.2.3.54
5.6.7.8-5.6.7.8
2.3.4.5-2.3.4.116

我試圖通過某種方式將它們放入MySQL數據庫中來找到阻止這些IP的最有效方法。 當然,我可以將所有塊分成單獨的IP並將它們放在自己的MySQL記錄中,但是對於大量的IP來說這將是非常低效的。 阻止整個范圍,例如“1.2.3。*”也會導致不必要地禁止大量用戶。

有沒有辦法有效地做到這一點?

為什么不使用網絡掩碼

  • 192.168.1.0/24阻止192.168.1.0 - 182.168.1.255
  • 1.0.0.0/8阻止1.0.0.0 - 1.255.255.255

這種方式只需要5個字節的IPv4地址。 如果你想要掩蓋你的狡猾,那就做8個字節。

通過簡單地將掩碼與IP進行對比,可以非常快速地進行比較。 這就是IP路由的工作原理。

此外,您可以使用MySQL函數INET_NTOAINET_ATON將點格式的IP地址轉換為數字形式,然后再返回,使存儲高效且易於使用。

我會有這樣一張桌子:

range | start_number | end_number
------+--------------+-----------

這將保持(例如): 1.2.34 ,和54分別。

然后,您可以輕松檢查連接的IP地址是否在該范圍內,以及最后一部分是否在start_numberend_number之間。

您可以使用MySQL INET_ATON()和INET_NTOA()函數。 請記住這些是特定於MySQL的,但您也可以使用php實現它們。

這些函數將點地址表示法中的IP地址轉換為整數。 然后,您可以將它們存儲在包含“start_ip”和“end_ip”列的表中。 當您查詢是否禁止IP時,可以使用BETWEEN查詢。

SELECT * FROM bans WHERE INET_ATON("127.0.0.1") BETWEEN start_ip AND end_ip

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM