在我的网站上用PHP阻止特定的IP块

iTa*_*ayb 11 php ip

例如,我希望阻止基本89.95(89.95 .)的每个IP .我的.htaccess服务器上没有文件,因此我必须使用PHP.

if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();
Run Code Online (Sandbox Code Playgroud)

会阻止特定的IP.如何阻止整个IP块?

非常感谢你.

Tyl*_*ter 13

尝试 strpos()

if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0)
{
    die();
}
Run Code Online (Sandbox Code Playgroud)

如果您注意到,===操作员确保它位于IP地址89.95开头.这意味着您可以根据需要分配尽可能多的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地址)


Mar*_*ams 5

使用ip2long()以点分十进制转换为真实IP地址。然后你可以很容易地做范围。

只需ip2long()在高低范围内获取值,然后将它们用作代码中的常量。

如果您熟悉子网掩码,您可以这样做:

// Deny 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");
}
Run Code Online (Sandbox Code Playgroud)

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

// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$prefix = 16;
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) {
  die("Unauthorized");
}
Run Code Online (Sandbox Code Playgroud)

您可以将这些转换为函数并拥有非常易于管理的代码,从而可以轻松添加 IP 地址和自定义范围。