首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實作 IP 封鎖與存取控制:單一 IP 與 IP 區段範例

     編輯:PHP 綜合知識

取得客戶端真實 IP 的健寫法

考量 Proxy、負載平衡器等情境,依優先序取得 IP:

<?php
if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
    $userip = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
    $userip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
    $userip = getenv('REMOTE_ADDR');
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
    $userip = $_SERVER['REMOTE_ADDR'];
}

封鎖單一 IP

if ($userip === '27.37.188.128') {
    header('Location: https://blocked.example.com');
    exit;
}

封鎖/允許 IP 區段(以 192.168.*.* 為例)

$ip_arr = explode('.', $userip);
// 只有 192.168.x.x 才允許存取
if (!($ip_arr[0] === '192' && $ip_arr[1] === '168')) {
    header('Location: https://blocked.example.com');
    exit;
} else {
    header('Location: https://allowed.example.com');
    exit;
}

進階建議:使用 CIDR 判斷

實務上建議封裝為函式支援 CIDR 表示法(如 192.168.0.0/16):

function ipInRange($ip, $cidr) {
    list($subnet, $mask) = explode('/', $cidr);
    $mask = $mask ?: 32;
    return (ip2long($ip) & ~((1 << (32 - $mask)) - 1)) === ip2long($subnet);
}

// 使用範例
if (!ipInRange($userip, '192.168.0.0/16')) {
    // 拒絕存取
}

部署注意事項

  • 放在程式進入點(如 index.php 或共用 config.php)最前端
  • 若使用 CDN/負載平衡器,需正確設定 X-Forwarded-For 信任清單
  • 記錄被封鎖 IP 供稽核分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved