加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用MySQL的通配符IP禁止

发布时间:2020-12-13 22:42:17 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试使用 MySQL在我的网络应用程序中实现IP禁止系统,我知道我可以使用.htaccess来实现它,但这对我来说不是很好. 基本上我目前的表是: ip_blacklist(id,ip,date) 在php中我查找数据库中的客户端IP以查看它是否被阻止: $sql = "SELECT ip FROM ip_blac
我正在尝试使用 MySQL在我的网络应用程序中实现IP禁止系统,我知道我可以使用.htaccess来实现它,但这对我来说不是很好.

基本上我目前的表是:

ip_blacklist(id,ip,date)

在php中我查找数据库中的客户端IP以查看它是否被阻止:

$sql = "SELECT ip FROM ip_blacklist WHERE ip = ? LIMIT 1"
$query = $this->db->query($sql,array($ip));
if($query->num_rows() > 0){
 // Gotcha
}

现在..这工作正常,但我希望能够在数据库中输入通配符IP范围,如:

42.21.58.*
42.21.*.*
53.*.*.*

怎么做?

提前致谢.

如果您将始终一次检查一个IP地址并且禁止的范围永远不会相交,则应以数字格式存储禁止范围的起始和结束地址.

说,你想禁止192.168.1.0到192.168.1.15,即192.168.1.0/28.

你创建一个这样的表:

CREATE TABLE ban (start_ip INT UNSIGNED NOT NULL PRIMARY KEY,end_ip INT UNSIGNED NOT NULL)

,在那里插入范围:

INSERT
INTO    ban
VALUES  (INET_ATON('192.168.1.0'),INET_ATON('192.168.1.0') + POWER(2,32 - 28) - 1)

然后检查:

SELECT  (
        SELECT  end_ip
        FROM    ban
        WHERE   start_ip <= INET_ATON('192.168.1.14')
        ORDER BY
                start_ip DESC
        LIMIT 1
        ) >= INET_ATON('192.168.1.14')

ORDER BY和LIMIT部分是查询有效所必需的.

如前所述,这一次假定非交叉块和一个IP.

如果块相交(例如,您同时禁止192.168.1.0/28和192.168.1.0/24),查询可能会返回错误否定.

如果您想一次查询多个IP(例如,更新具有长IP地址列表的表),那么此查询将是低效的(MySQL不会很好地优化相关子查询中的范围)

在这两种情况下,您都需要将范围存储为LineString,并使用空间索引进行快速搜索:

CREATE TABLE ban (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,range LINESTRING NOT NULL) ENGINE=MyISAM;

CREATE SPATIAL INDEX sx_ban_range ON ban (range);

INSERT
INTO    ban (range)
VALUES  (
        LineString
                (
                Point(INET_ATON('192.168.1.0'),-1),Point(INET_ATON('192.168.1.0') + POWER(2,32 - 28) - 1),1)
                )
        );

SELECT  *
FROM    ban
WHERE   MBRContains(range,Point(INET_ATON('192.168.1.14'),0))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读