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