在PHP中,阻止特定IP地址访问我的网站。

9 浏览
0 Comments

在PHP中,阻止特定IP地址访问我的网站。

例如,我想屏蔽所有以89.95开头的IP地址(89.95..)。

由于我的服务器上没有.htaccess文件,所以我需要用PHP来实现这个功能。

使用以下代码可以屏蔽特定的IP地址:

if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();

但是如何屏蔽整个IP地址块呢?

0
0 Comments

使用ip2long()函数将点分十进制转换为真实IP地址。然后可以轻松地处理IP地址范围。

只需对高位和低位的范围使用ip2long()函数获取值,然后在代码中将其作为常量使用。

如果熟悉子网掩码,可以这样实现:

// 拒绝10.12.*.*

$network = ip2long("10.12.0.0");

$mask = ip2long("255.255.0.0");

$ip = ip2long($_SERVER['REMOTE_ADDR']);

if (($network & $mask) == ($ip & $mask)) {

die("Unauthorized");

}

或者如果熟悉这种格式10.12.0.0/16:

// 拒绝10.12.*.*

$network = ip2long("10.12.0.0");

$prefix = 16;

$ip = ip2long($_SERVER['REMOTE_ADDR']);

if (($network >> (32 - $prefix)) == ($ip >> (32 - $prefix))) {

die("Unauthorized");

}

可以将这些转换为函数,并且代码可管理性很高,可以轻松添加IP地址和自定义范围。

谢谢!这就是我们的做法。

仅仅检查$_SERVER{'REMOTE_HOST'}就足够了吗?因为用户可能使用代理。所以还有其他参数需要检查,比如REMOTE_ADDR或这些。我是对的吗?或者使用我链接的方法没有用处?

是的,只需使用REMOTE_ADDR即可。

0
0 Comments

在这段代码中使用整数的原因是为了处理IP地址范围,而不仅仅是单个IP地址。将IP地址转换为整数可以更方便地比较和处理。

代码中首先使用ip2long函数将点分十进制表示的IP地址转换为整数。然后,使用sprintf函数将无符号整数转换为字符串,这样可以确保IP地址转换为的整数是正数。

接下来,使用逻辑运算符和比较运算符检查IP地址是否在允许的范围内。如果IP地址不在10.0.0.0 - 10.255.255.255范围内,则会输出"Forbidden."并终止程序。

使用整数来处理IP地址的好处是可以更高效地进行比较和计算。相比之下,处理点分十进制表示的IP地址可能需要更多的代码和计算。

通过将IP地址转换为整数,我们可以使用位运算和比较运算符来更方便地判断IP地址是否在指定的范围内。这样可以简化代码,并提高执行效率。

因此,使用整数来处理IP地址可以提供更高效和方便的方法来阻止特定的IP地址范围访问网站。

以下是使用PHP在网站中阻止特定IP地址范围的示例代码:

$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
// 允许的IP地址范围:10.0.0.0 - 10.255.255.255
if (!($ip >= 167772160 && $ip <=  184549375)) {
    die('Forbidden.');
}

通过将上述代码添加到网站的访问控制逻辑中,可以阻止位于10.0.0.0 - 10.255.255.255范围内的IP地址访问网站。这可以帮助您限制特定的IP地址范围,提高网站的安全性和稳定性。

0
0 Comments

问题的出现的原因以及解决方法:

问题的出现原因:需要在PHP中阻止特定IP地址的访问。

解决方法:使用strpos()函数进行判断,如果IP地址的前缀匹配指定的IP地址,则阻止访问。

具体代码如下:

if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0)
{
    die();
}

其中,===操作符用于确保IP地址的前缀与指定的IP地址匹配,这意味着无论后面跟着什么数字,只要前缀匹配,都将被阻止访问。

例如,以下所有IP地址都将被阻止访问:

- 89.95 -> 89.95.12.34, 89.95.1234.1, 89.95.1.1

- 89.95.6 -> 89.95.65.34, 89.95.61.1, 89.95.6987(其中一些不是有效的IP地址)

需要注意的是,如果将===替换为==,行为将发生变化,因此不要这样做。应使用三个等号。

这里使用strpos函数比substr函数更快,这并不令人惊讶。因为如果测试失败,strpos可以立即返回,而不需要进行任何字符串复制或分配。同时,需要注意的是,对于较长的字符串,strpos可能会更慢,因为它需要遍历整个字符串来搜索目标字符串。=====之间的区别,我知道。

总结一下,以上是通过使用strpos()函数来阻止特定IP地址访问的解决方法。

0