使用PHP和MySQL阻止和/或重定向大型IP列表

时间:2013-03-18 18:48:35

标签: php redirect ip-address

我有一个外部IP列表,我想在我的网站上阻止(或者,更好的是,重定向)。我首先采用.htaccess方法但后来意识到使用PHP可能更容易。但现在我不确定......似乎PHP和MySQL一起是最好的选择。

我在MySQL中有一个包含CIDR块的表。我一直在努力将用户的IP与表格进行比较。

什么是最好的方法?

我正在考虑以某种方式检查被阻止的IP,像这样(PHP和伪代码):

$user_ip = $_SERVER['REMOTE_ADDR'];

loop through returned rows {
    if ($user_ip in returned row from MySQL table) {
        forward to another domain
    }

    else // do something else...
}

但我正在处理知识产权组;不是单一的IP。我一直在使用一些CIDR脚本和ip2long来反汇编和解析组。但事实证明这很困难。

根据评论的建议,如果我将IP存储在数据库中,我可以直接比较。但我正在处理的整个区块都是巨大的,我不确定这样做。我将在比较中处理数百万的IP ......

有关如何最好地完成此任务的任何建议?

1 个答案:

答案 0 :(得分:0)

我最终能够解决这个问题。这就是我做的......

首先,我创建了一个脚本,将我庞大的IP CIDR块列表注入MySQL。

然后,我编写了一个脚本,首先查询数据库,获取IP块, 将它们收集到一个数组中,然后使用此处找到的函数(Find whether a given IP exists in CIDR or not)将用户的IP与数据库中的CIDR块进行比较。

// initialize array
$cidr_block = array();

// query mysql database for all id and ip_cidr values
$query = "SELECT id, ip_cidr FROM ip_blocks";

// use mysqli class to query database
if ($result = $mysqli -> query($query)) {

    // build array for testing with  IP_vs_CIDR class
    while ($row = $result -> fetch_assoc()) {
        $cidr_block[] = $row['ip_cidr'];
    }

    // run IP_vs_CIDR on user ip address and cidr block array from database
    $cidr_result = $ip_vs_cidr -> test_user_ip($user_ip, $cidr_block);

    // test ip against the array values and send elswhere if bad
    if ($cidr_result) {
        header('Location: http://www.google.com/');
    }

    // free up result set
    $result -> close();
}

然后,我根据这个结果重定向。似乎工作得很好,因为用户IP的固定IP进行了多次测试(例如,$user_ip = '75.150.41.15')正确测试并按预期重定向。我测试了黑名单中的IP而不是两种基础。

感谢您的评论 - 他们很有帮助。