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

PHP IP 過濾完整實作:支援 CIDR、IP 範圍、單一 IP 的靈活匹配函式

     編輯:PHP 綜合知識

應用場景

後台設定黑名單/白名單,支援三種格式:單一 IP(`192.168.1.1`)、IP 範圍(`192.168.1.10-192.168.1.20`)、CIDR(`192.168.1.0/24`)。初始化時讀取規則,每請求檢查客戶端 IP 是否命中。

核心函式

<?php
/**
 * IP 地址匹配檢查
 * @param string $network 規則:單一IP / IP範圍 / CIDR
 * @param string $ip 待檢查 IP
 * @return bool
 */
function netMatch($network, $ip) {
    $network = trim($network);
    $ip = trim($ip);

    // IP 範圍:174.129.0.0 - 174.129.255.255
    if (($pos = strpos($network, '-')) !== false) {
        $from = ip2long(substr($network, 0, $pos));
        $to   = ip2long(substr($network, $pos + 1));
        $ipLong = ip2long($ip);
        return ($ipLong >= $from && $ipLong <= $to);
    }

    // CIDR:174.129.0.0/16
    if (strpos($network, '/') !== false) {
        list($net, $mask) = explode('/', $network);
        $netLong = ip2long($net);
        $ipLong = ip2long($ip);
        // 計算網路遮罩:~((1 << (32 - $mask)) - 1)
        $maskLong = ~((1 << (32 - $mask)) - 1);
        return (($ipLong & $maskLong) == $netLong);
    }

    // 單一 IP
    return $network === $ip;
}

// 測試
var_dump(netMatch('174.129.0.0 - 174.129.255.255', '174.129.1.31')); // true
var_dump(netMatch('174.129.0.0/16', '174.139.1.31')); // false
var_dump(netMatch('174.129.1.32', '174.129.1.31')); // false
?>

整合建議

  1. 設定檔/資料庫儲存規則陣列,啟動時載入快取。
  2. 中介層/前端控制器統一攔截:
    `if (checkIpBlacklist($_SERVER['REMOTE_ADDR'])) { http_response_code(403); exit('Forbidden'); }`
  3. 支援 IPv6:改用 `inet_pton`/`inet_ntop` 處理 128 位址,或引用 `symfony/polyfill-php72` 等庫。
  4. 動態 IP 局限:中國多為動態 IP,封鎖 IP 易誤傷/失效,建議結合行為分析、驗證碼、頻率限制。

CIDR 遮罩計算原理圖解

/24 → 255.255.255.0 → 二進位 11111111.11111111.11111111.00000000
IP & 遮罩 = 網路位址 → 比較是否等於規則網路位址

參考來源:PHP.net ip2long 註釋 #70055, #82397。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved