如何在SQL查询中过滤IP地址范围?

时间:2019-04-09 08:13:01

标签: mysql sql ip-address

我正在使用Web应用程序,当用户尝试登录我的应用程序时我做了一些检查/限制。现在,我需要使用白名单功能来通过用户IP地址通过这些检查。

我正在尝试编写一条sql语句来获取匹配的IP地址,以实现白名单。如果sql返回数据,则通过检查,否则就不继续检查。

但是,数据库中的白名单表需要支持192.168。*或192. *或(*。* .1.1)。因此,如果用户ip为192.X.X.X,它将返回数据并通过

SELECT * FROM whitelist WHERE ip_address = $ip;

我的sql语句是这样的。

3 个答案:

答案 0 :(得分:1)

我同意@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)

当您需要匹配*.*.1.1之类的东西时,这是自然而然的情况。

IP地址通常根据其CIDR表示法的子网进行匹配。因为这是网络的组织方式。

更简单的是,您可以使用long将IP地址转换为INET_ATON()数据类型,并使用><进行简单匹配。

请参考以下解决方案:

Is there way to match IP with IP+CIDR straight from SELECT query?

https://dba.stackexchange.com/questions/171044/determining-if-an-ip-is-within-an-ipv4-cidr-block

答案 2 :(得分:0)

您可以使用"someArray": [ { "someProperty":"someValue", // other properties that are not relevant for me }, { "someProperty":"someOtherValue", // other properties that are not relevant for me } ] 语句:

LIKE

SELECT * FROM whitelist WHERE ip_address LIKE '192.168.%'; 字符允许任何字符替换它,因此,如果您在此字段中确实只有IP地址,则上面的查询将返回192.168.0.0-192.168.255.255范围内的IP地址。