【问题标题】:How to filter a range of IP addresses in a SQL query?如何在 SQL 查询中过滤 IP 地址范围?
【发布时间】:2019-08-30 11:07:39
【问题描述】:

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

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

但是数据库中的白名单表需要支持192.168.* or 192.* or (*. *.1.1) ,所以如果用户ip是192.X.X.X就会返回数据并通过

SELECT * FROM whitelist WHERE ip_address = $ip;

我的sql语句是这样的。

【问题讨论】:

  • 如果您要检查的值很少,您可以使用正则表达式而不是数据库来执行此操作,对吧?

标签: mysql sql ip-address


【解决方案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地址。但是您可以根据自己的要求进行更改。

【讨论】:

    【解决方案2】:

    当您需要匹配 *.*.1.1 之类的内容时,没有自然的情况。

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

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

    请参考以下解决方案:

    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

    【讨论】:

      【解决方案3】:

      您可以使用LIKE 声明:

      SELECT * FROM whitelist WHERE ip_address LIKE '192.168.%';
      

      % 字符允许任何字符替换它,因此上述查询将返回 192.168.0.0 - 192.168.255.255 范围内的 IP 地址,前提是您确实在此字段中只有 IP 地址。

      【讨论】:

      • 当数据库值为192.168.*.*且查询值为192.168.1.1时,这将无济于事...
      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2013-11-23
      • 2019-03-25
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      相关资源
      最近更新 更多