在PHP中限制IP地址范围,可以通过以下方法实现,以下是几种常见场景的解决方案:

精确匹配单个IP
$allowedIP = '192.168.1.100';
$clientIP = $_SERVER['REMOTE_ADDR'];
if ($clientIP !== $allowedIP) {
die('Access denied');
}
匹配CIDR范围(如 168.1.0/24)
function ipInCidr($ip, $cidr) {
list($subnet, $mask) = explode('/', $cidr);
$ip = ip2long($ip);
$subnet = ip2long($subnet);
$mask = -1 << (32 - $mask);
$subnet &= $mask; // 确保子网地址正确
return ($ip & $mask) == $subnet;
}
$allowedRange = '192.168.1.0/24';
$clientIP = $_SERVER['REMOTE_ADDR'];
if (!ipInCidr($clientIP, $allowedRange)) {
die('Access denied');
}
匹配IP段(如 168.1.1-192.168.1.50)
function ipInRange($ip, $start, $end) {
$ip = ip2long($ip);
$start = ip2long($start);
$end = ip2long($end);
return $ip >= $start && $ip <= $end;
}
$clientIP = $_SERVER['REMOTE_ADDR'];
$startIP = '192.168.1.1';
$endIP = '192.168.1.50';
if (!ipInRange($clientIP, $startIP, $endIP)) {
die('Access denied');
}
允许多个IP或范围(数组匹配)
$allowedIPs = [
'203.0.113.10', // 单个IP
'192.168.1.0/24', // CIDR范围
['10.0.0.1', '10.0.0.50'] // IP段
];
$clientIP = $_SERVER['REMOTE_ADDR'];
$accessAllowed = false;
foreach ($allowedIPs as $rule) {
if (is_string($rule)) {
// 处理CIDR或单个IP
if (strpos($rule, '/') !== false) {
if (ipInCidr($clientIP, $rule)) {
$accessAllowed = true;
break;
}
} elseif ($clientIP === $rule) {
$accessAllowed = true;
break;
}
} elseif (is_array($rule)) {
// 处理IP段
if (ipInRange($clientIP, $rule[0], $rule[1])) {
$accessAllowed = true;
break;
}
}
}
if (!$accessAllowed) {
die('Access denied');
}
处理代理服务器后的真实IP
如果用户通过代理(如CDN),需从X-Forwarded-For获取真实IP:
function getClientIP() {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim(end($ips)); // 取最后一个IP(最接近客户端的)
}
return $_SERVER['REMOTE_ADDR'];
}
$clientIP = getClientIP();
使用防火墙(更高效)
对于高性能场景,建议在Web服务器层配置IP限制:

- Apache(在
.htaccess中):Order Deny,Allow Deny from all Allow from 192.168.1.0/24
- Nginx(在
server配置中):location / { deny all; allow 192.168.1.0/24; allow 10.0.0.1; deny all; # 拒绝剩余IP }
注意事项
- IP伪造:
X-Forwarded-For可被篡改,仅在信任代理时使用。 - IPv6支持:上述代码需扩展以支持IPv6(使用
inet_pton等函数)。 - 性能优化:频繁的IP检查可能影响性能,考虑缓存或前置防火墙规则。
- 动态IP:如果用户IP动态变化,需结合其他验证(如Token、登录状态)。
根据需求选择合适的方法,优先使用Web服务器级限制以减轻PHP负担。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/291023.html

