1

我有一个外部 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 组;不是单个IP​​。我一直在使用一些 CIDR 脚本和 ip2long 来反汇编和解析这些组。但这已被证明是困难的。

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

关于如何最好地做到这一点的任何建议?

4

1 回答 1

0

我终于能够解决这个问题。这是我所做的...

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

然后,我编写了一个脚本,首先查询数据库,获取 IP 块,将它们收集到一个数组中,然后使用这里找到的函数(查找给定 IP 是否存在于 CIDR 中)将用户的 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 而不是,以涵盖两个基础。

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

于 2013-03-21T23:57:57.527 回答