我正在使用Web应用程序,当用户尝试登录我的应用程序时我做了一些检查/限制。现在,我需要使用白名单功能来通过用户IP地址通过这些检查。
我正在尝试编写一条sql语句来获取匹配的IP地址,以实现白名单。如果sql返回数据,则通过检查,否则就不继续检查。
但是,数据库中的白名单表需要支持192.168。*或192. *或(*。* .1.1)。因此,如果用户ip为192.X.X.X,它将返回数据并通过
SELECT * FROM whitelist WHERE ip_address = $ip;
我的sql语句是这样的。
答案 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地址。