簡體   English   中英

如何在SQL查詢中過濾IP地址范圍?

[英]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.

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