首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用基于PHP/MySQL的脚本禁止来自网站的IP阻止?

如何使用基于PHP/MySQL的脚本禁止来自网站的IP阻止?
EN

Stack Overflow用户
提问于 2012-06-08 03:50:59
回答 3查看 1.1K关注 0票数 3

我有一个相当大的IP和IP块列表,我想要禁止。我的列表是以块为单位完成的,目前的格式如下:

代码语言:javascript
复制
1.2.3.4-1.2.3.54
5.6.7.8-5.6.7.8
2.3.4.5-2.3.4.116

我试图通过某种方式将这些IP放入MySQL数据库中,从而找到阻止这些IP的最有效的方法。当然,我可以将所有块分成单独的IP,并将它们放在它们自己的MySQL记录中,但对于大量的IP,这将是非常低效的。阻止整个范围,例如"1.2.3.*“也会导致不必要的禁止许多用户。

有没有一种方法可以有效地做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-08 04:07:08

您可以使用MySQL INET_ATON()和INET_NTOA()函数。请记住,这些是特定于MySQL的,但您也可以使用php来实现它们。

这些函数将IP地址从点标记转换为整数。然后,您可以将它们存储在具有"start_ip“和"end_ip”列的表中。当您查询某个IP是否被禁用时,您可以使用介于两者之间的查询。

代码语言:javascript
复制
SELECT * FROM bans WHERE INET_ATON("127.0.0.1") BETWEEN start_ip AND end_ip
票数 1
EN

Stack Overflow用户

发布于 2012-06-08 03:56:23

为什么不使用netmasks

  • 192.168.1.0/24数据块192.168.1.0 - 182.168.1.255
  • 1.0.0.0/8数据块1.0.0.0 - 1.255.255.255

通过这种方式,IPv4地址只需要5个字节。如果你想巧妙地使用你的掩码,那就把它设为8字节。

这样做的好处是,通过简单地将掩码与IP进行OR运算,可以非常快速地进行比较。这就是IP路由的工作原理。

此外,您还可以使用MySQL函数INET_NTOAINET_ATON将点格式的IP地址转换为数字格式,然后再转换回来,从而使存储更加高效且易于使用。

票数 5
EN

Stack Overflow用户

发布于 2012-06-08 03:57:55

我会有一个这样的表:

代码语言:javascript
复制
range | start_number | end_number
------+--------------+-----------

它们将分别保存(例如):1.2.3454

然后,您可以轻松地检查连接的IP地址是否在该范围内,以及最后一部分是否在start_numberend_number之间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10938865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档