Я пробовал много способов, но все они не работают для меня, я думаю, что они устарели, и все изменилось. Может быть, кто-то может посоветовать мне направление раскопок?
Я являюсь автором библиотеки PHP под названием TorUtils это обеспечивает ряд классов, связанных с Tor и реле.
Один из классов, который это обеспечивает, TorDNSEL
пример который дает вам простой интерфейс для запроса списка выхода Tor DNS, чтобы определить, является ли удаленный IP-адрес Tor-ретранслятором, обращающимся к вашему сайту.
Использование простое:
<?php
use Dapphp\TorUtils\TorDNSEL;
require_once 'src/TorDNSEL.php';
try {
$isTor = TorDNSEL::IpPort(
$_SERVER['SERVER_ADDR'],
$_SERVER['SERVER_PORT'],
$_SERVER['REMOTE_ADDR']
);
var_dump($isTor); // true or false
} catch (\Exception $ex) {
echo $ex->getMessage() . "\n"; // could be DNS time out, or other network issue
}
TorDNSEL
Скрипт не требует каких-либо других классов и может быть загружен и использован как автономный скрипт. Он делает запрос DNS, но создает его напрямую, поэтому вам также не нужны никакие функции DNS или библиотеки, доступные для PHP.
В качестве альтернативы я использую ControlClient
класс для поддержания очень свежих списков выхода. С его помощью вы можете создавать свои собственные списки (для подключения вам понадобится собственный ретранслятор Tor, или вы можете использовать органы каталогов для создания списков). Еще проще, просто периодически скачивайте и проверяйте списки выхода, которые я экспортирую Вот. Список обновляется каждые 10 минут, поэтому старайтесь не загружать его чаще, чем раз в 10 минут или около того.
Затем сохраните его где-нибудь на своем сайте и сравните IP-адрес клиента с теми, которые указаны в списке.
Вы можете скачать исходники с GitHub или composer require dapphp/torutils
установить в существующий проект.
Надеюсь, это поможет, дайте мне знать, если я могу ответить на что-нибудь еще.
Использование check.torproject.org
Для каждого пользователя, который посещает веб-сайт, мы проверяем, соответствует ли его IP-адрес известному IP-адресу выходного узла и разрешает ли его политика выхода доступ к этому веб-сайту через порт 443 (HTTPS). Если это так, то мы можем сделать хорошее предположение, что пользователь успешно подключился через сеть Tor.
Вы можете найти его источник на https://git.torproject.org/check.git. Это под лицензией MIT. Ты можешь использовать Exits.IsTor
в datastore.go, чтобы определить, приходит ли запрос от tor. Вам нужно изменить
var DefaultTarget = AddressPort{"38.229.72.22", 443}
на IP-адрес и порт вашего сервера. Вам также понадобится некоторый интерфейс, написанный на Go, если вы используете PHP, если вы хотите использовать их код.
Если вы используете Cloudflare, он использует двухбуквенный код «T1» для Tor, и вы можете иметь собственные правила для Tor.
Обратите внимание, что трудно отличить запрос напрямую от узла выхода Tor (не через Tor) от запроса от Tor. Большинство мест предполагают, что все они из Тор.