[英]How to filter a range of IP addresses in a SQL query?
我正在使用Web應用程序,當用戶嘗試登錄我的應用程序時我做了一些檢查/限制。 現在,我需要進行白名單功能以通過使用用戶ip地址的這些檢查。
我正在嘗試編寫一條sql語句來獲取匹配的IP地址,以實現白名單。 如果sql返回數據,則通過檢查,如果不是,則繼續檢查。
但是,數據庫中的白名單表需要支持192.168。*或192. *或(*。*。1.1),因此如果用戶ip為192.XXX,它將返回數據並通過
SELECT * FROM whitelist WHERE ip_address = $ip;
我的sql語句是這樣的。
我同意@arno的評論。 如果要檢查的值有限,請使用正則表達式而不是數據庫調用。 這樣可以節省您的時間。
但是,如果您想調用數據庫,那么我還記得MySql在查詢中也支持正則表達式
SELECT
*
FROM
whitelist
WHERE
ip_address REGEXP '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
上面的正則表達式是檢查所有有效的IP地址。 但是您可以根據需要進行更改。
當您需要匹配*.*.1.1
類的東西時,沒有自然的情況。
IP地址大多根據其CIDR表示法的子網進行匹配。 因為這是網絡的組織方式。
更簡單的是,您可以使用INET_ATON()
將IP地址轉換為long
數據類型,並使用>
和<
進行簡單匹配。
請參考以下解決方案:
是否可以直接從SELECT查詢中將IP與IP + CIDR匹配?
https://dba.stackexchange.com/questions/171044/determining-if-an-ip-is-within-an-ipv4-cidr-block
您可以使用LIKE
語句:
SELECT * FROM whitelist WHERE ip_address LIKE '192.168.%';
%
字符允許任何字符替換它,因此,如果您在此字段中確實只有IP地址,則上面的查詢將返回192.168.0.0-192.168.255.255范圍內的IP地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.