繁体   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