<?php
/* 
 * ---------------------------------
 * Author : Luz (Modified for PHP 8.0)
 * CreateTime : 03/12/2014 22:12:03
 * ---------------------------------
 * ip黑名单与获取处理
 */

// 引入数据库配置
require_once ('include/config.php');

// --- 1. 修复获取IP函数 ---
// 原函数名 getIp() 与后面调用的 GetIP() 可能存在大小写冲突，且逻辑可以简化
function GetIP() {
    static $realip = null; // 使用 null 而不是 ''，并使用 static 避免重复处理
    
    if ($realip !== null) {
        return $realip;
    }

    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
        $cip = $_SERVER["HTTP_CLIENT_IP"];
    } else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } else if (!empty($_SERVER["REMOTE_ADDR"])) {
        $cip = $_SERVER["REMOTE_ADDR"];
    } else {
        $cip = 'unknown';
    }

    // 使用正则提取IP，兼容原逻辑
    preg_match("/[\d\.]{7,15}/", $cip, $cips);
    $realip = !empty($cips[0]) ? $cips[0] : 'unknown';
    
    return $realip;
}

// --- 2. 修复数组处理函数 ---
// 原递归函数使用 static 变量在多次调用时会有缓存问题，已改为非静态或重置逻辑
function arrayChange($arr) {
    $arr2 = array(); // 每次调用都初始化
    foreach ($arr as $v) {
        if (is_array($v)) {
            // 递归合并
            $arr2 = array_merge($arr2, arrayChange($v));
        } else {
            $arr2[] = $v;
        }
    }
    return array_values($arr2); // 重置键名
}

// --- 3. 修复 SQL 查询函数 ---
// 原函数 getAll() 没有传入 $db 连接，PHP 8.0 会报错
function getAll($sql) {
    global $db; // 关键修复：引入全局数据库连接变量
    
    $res = mysqli_query($db, $sql); // 修复：传入 $db 参数
    if ($res !== false) {
        $arr = array();
        while ($row = mysqli_fetch_assoc($res)) {
            $arr[] = $row;
        }
        return arrayChange($arr);
    } else {
        // 输出SQL错误信息，方便调试
        // echo "SQL Error: " . mysqli_error($db);
        return false;
    }
}

// --- 4. 修复黑名单拦截逻辑 ---
function blockUsers($ipAddresses) {
    $userIp = GetIP(); // 使用修正后的函数
    if ($userIp == 'unknown') return false;

    $userOctets = explode('.', $userIp);
    $userOctetsCount = count($userOctets);

    foreach ($ipAddresses as $ipAddress) {
        $octets = explode('.', $ipAddress);
        if (count($octets) != $userOctetsCount) {
            continue;
        }
        
        $match = true;
        for ($i = 0; $i < $userOctetsCount; $i++) {
            // 允许数据库中存 * 作为通配符，例如 192.168.1.*
            if ($userOctets[$i] != $octets[$i] && $octets[$i] != '*') {
                $match = false;
                break;
            }
        }
        
        if ($match) { 
            return true; // 发现匹配，直接返回 true
        }
    }
    
    return false; // 没有发现匹配
}

// --- 5. 执行拦截检查 ---
// 注意：这里假设您的 config.php 中数据库连接变量名为 $db
// 如果 config.php 中定义的是 $conn 或 $link，请修改下面的变量名

// 获取黑名单列表
$sql1 = "SELECT ip FROM blacklists"; // 注意：原表名是 blacklists (复数)
$blockAddresses = getAll($sql1);

// 执行拦截
if (blockUsers($blockAddresses)) {
    // 如果是黑名单，跳转
    header("Location: http://5kun.com/book");
    exit; 
}

// 如果不是黑名单，脚本静默执行，继续加载留言板页面
?>