无法使用 ip 检查代码(单个规则有效,多个无效)

Can't get working ip check code(single rule is working, multiple not)

需要将所有 Tor 用户从我的页面转发出去,并检查 tor 列表中的 ip。 单一检查适用于 ipv4 但不适用于 ipv6 和多个列表检查。 无法理解我在哪里出错。 代码:

$torip = file("https://check.torproject.org/torbulkexitlist", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$torexits = file("https://lists.fissionrelays.net/tor/exits-ipv6.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$tornode = file("https://lists.fissionrelays.net/tor/relays-ipv6.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$client_ip = $_SERVER['REMOTE_ADDR'];
if (in_array($client_ip, $torip)){ 
header('Location: https://www.google.com/'); 
}
if (in_array($client_ip, $tornode)){
header('Location: https://www.google.com/'); 
}
if (in_array($client_ip, $torexits)){
header('Location: https://www.google.com/'); 
}

正在尝试不同的方式,例如

if(in_array($client_ip, $torip) or in_array($client_ip, $tornode) or in_array($client_ip, $torexits))

如果...elseif..elseif

same 可以通过 tor 使用列表中的 ip 进入内部,但无法理解问题出在哪里。 感谢大家的帮助。

UDP: 代码部分

$tornode = file("https://lists.fissionrelays.net/tor/relays-ipv6.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$client_ip = $_SERVER['REMOTE_ADDR'];
if (in_array($client_ip, $tornode)){
header('Location: https://www.google.com/');
die();  
}

正在 100% 工作 - 问题 - 如何以正确的方式在检查中添加其他列表?

这里有几件事...

  1. 我希望您不会在每次有人访问您的页面时都下载这些列表。您应该将列表下载结果缓存一小段时间,而不是不断下载。

  2. 您唯一需要的裂变继电器列表是 exits.txt。如 https://fissionrelays.net/lists 所述,exits.txt 包含 IPv4 和 IPv6 出口节点。下载它而不是 exits-ipv6.txt 和 relays-ipv6.txt.

  3. 阻止不是出口的 Tor 中继是不正确的。来自中继 IP 的点击不是 Tor 流量。例如,我 运行 家里有一个守卫中继,不允许出口流量。它的 IP 出现在中继列表中,但它不允许任何 Tor 出口流量,因此来自该 IP 的任何点击都不是来自 Tor。

如果您想使用多个列表,那很好。我会建议以下步骤来满足您的需求:

1. Download & combine all lists every 10+ minutes
2. De-duplicate and sort the list
3. Save to a file
4. Write a function to search the cached file.

对于1-3,您可以使用https://gitlab.com/fissionrelays/lists/-/blob/master/tor.php,这是裂变中继提供的下载器来下载他们的列表。它也排序。

如果您的列表排序正确,您可以对列表进行二进制搜索以获得更好的结果,但这是更高级的方法,不是必需的。

提示,下载列表时,不要使用file()作为数组下载。请改用 file_get_contents(),并将每个列表附加到另一个列表上。下载并合并所有列表后,将它们处理成一个数组(跳过重复),然后对列表进行排序。

这是一个二进制搜索函数,您可以使用它来更快地搜索 已排序 列表。

/**
 * Perform binary search of a sorted array.
 * Credit: http://php.net/manual/en/function.array-search.php#39115
 *
 * Tested by [VigilanTor](https://wordpress.org/plugins/vigilantor/) for accuracy and efficiency
 *
 * @param string $needle String to search for
 * @param array $haystack Array to search within
 * @return boolean|number false if not found, or index if found
 */
protected function arrayBinarySearch($needle, $haystack)
{
    $high = count($haystack);
    $low = 0;

    while ($high - $low > 1){
        $probe = ($high + $low) / 2;
        if ($haystack[$probe] < $needle){
            $low = $probe;
        } else{
            $high = $probe;
        }
    }

    if ($high == count($haystack) || $haystack[$high] != $needle) {
        return false;
    } else {
        return $high;
    }
}

此外,请确保在发送 header(Location) 重定向后调用 exit(),因为您希望终止请求并立即重定向而无需 运行 额外 PHP代码。

if (in_array($needle, $haystack)) {
    header('Location: https://www.google.com/');
    exit; // Redirect now and don't run any further PHP code
}

最后,如果您想假设所有 Tor 流量都是“坏”的,那很好。考虑一条错误消息,而不是在没有解释的情况下默默地重定向流量,这是不好的 user-experience。许多人使用 Tor 进行随意浏览,因此您实际上是在无缘无故地从您的网站引导这些用户。