无法使用 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% 工作 - 问题 - 如何以正确的方式在检查中添加其他列表?
这里有几件事...
我希望您不会在每次有人访问您的页面时都下载这些列表。您应该将列表下载结果缓存一小段时间,而不是不断下载。
您唯一需要的裂变继电器列表是 exits.txt
。如 https://fissionrelays.net/lists 所述,exits.txt 包含 IPv4 和 IPv6 出口节点。下载它而不是 exits-ipv6.txt 和 relays-ipv6.txt.
阻止不是出口的 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 进行随意浏览,因此您实际上是在无缘无故地从您的网站引导这些用户。
需要将所有 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% 工作 - 问题 - 如何以正确的方式在检查中添加其他列表?
这里有几件事...
我希望您不会在每次有人访问您的页面时都下载这些列表。您应该将列表下载结果缓存一小段时间,而不是不断下载。
您唯一需要的裂变继电器列表是
exits.txt
。如 https://fissionrelays.net/lists 所述,exits.txt 包含 IPv4 和 IPv6 出口节点。下载它而不是 exits-ipv6.txt 和 relays-ipv6.txt.阻止不是出口的 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 进行随意浏览,因此您实际上是在无缘无故地从您的网站引导这些用户。