检查用户是否使用 Tor 请求站点的现代方法是什么? (php)

What is the modern way to check if user is requesting site using Tor? (php)

我尝试了很多方法,但所有方法都不适合我,我想它们已经过时并且情况发生了变化。也许有人可以告诉我挖掘的方向?

check.torproject.org使用的方式是

For every user that hits the website, we check if their IP matches a known exit node's IP, and that its exit policy would allow accessing this website on port 443(HTTPS). If it is, then we can make a good assumption that the user has successfully connected via the Tor network.

您可以在 https://git.torproject.org/check.git 找到它的来源。它在麻省理工学院的许可下。可以在datastore.go中使用Exits.IsTor判断请求是否来自tor。你需要改变

var DefaultTarget = AddressPort{"38.229.72.22", 443}

到您服务器的 IP 地址和端口。如果你想使用他们的代码,你还需要一些用 Go 编写的界面 PHP。

如果您使用 Cloudflare,它会为 Tor 使用 2 个字母的代码 "T1",并且您可以为 Tor 使用自定义规则。

请注意,很难区分直接来自 Tor 出口节点(不是通过 Tor)的请求和来自 Tor 的请求。大多数地方都认为它们都来自 Tor。

我是一个名为 TorUtils 的 PHP 库的作者,它提供了许多与 Tor 和中继相关的 classes。

它提供的 classes 之一是 TorDNSEL example 它为您提供了一个简单的界面来查询 Tor DNS 出口列表以查看远程 IP 是否是 Tor 中继访问您的网站。

用法简单(示例更新于 2022/02/04):

<?php

use Dapphp\TorUtils\TorDNSEL;

require_once 'src/TorDNSEL.php';

// Practical usage on a web server:
try {
    if (TorDNSEL::isTor($_SERVER['SERVER_ADDR'])) {
       // do something special for Tor users
    } else {
        // not using Tor, educate them! :-D
    }
} catch (\Exception $ex) {
    error_log("Tor DNSEL query failed: " . $ex->getMessage());
}

TorDNSEL 脚本不需要任何其他 classes,可以作为独立脚本下载和使用。它发出 DNS 请求,但直接构建它,因此您也不需要 PHP.

可用的任何 DNS 函数或库

或者,我使用 ControlClient class 来维护非常新的退出列表。您可以使用它来构建自己的列表(您需要自己的 Tor 中继才能连接,或者您也可以使用目录机构来构建列表)。更简单的是,定期下载并检查我导出的退出列表 here。该列表每 10 分钟更新一次,因此请尽量不要每 10 分钟左右下载一次以上。

然后将其保存到您网站的某处,并根据列表中的 IP 检查客户端 IP。

您可以从 GitHub 或 composer require dapphp/torutils 下载源代码以安装到现有项目。

希望对您有所帮助,如果我可以进一步回答任何问题,请告诉我。

Tor 浏览器是否签入 PHP 我目前使用的代码:

<?php

namespace neoistone;

class TOR
{

    public static function isTorRequest()
    {
        $ipServeur = $_SERVER['SERVER_ADDR'];
        $ipUser = $_SERVER['REMOTE_ADDR'];
        
        if(is_file(TMP.'torips.db') == false){
            self::tor_ips_update();
        }
        
        if (self::match_ips($ipServeur)) {
            return true;
        } elseif (self::match_ips($ipUser)) {
            return true;
        } else {
            return false;
        }
    }
    
    public static function tor_ips_update()
    {
        file_put_contents(TMP.'torips.db',file_get_contents('https://check.torproject.org/torbulkexitlist'));
    }
    
    public static function match_ips($ip)
    {
       $lines = file(TMP.'torips.db', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
       return in_array($ip, $lines);
    }
}
?>

直播URLhttps://reseller.neoistone.com/api/