Есть ли способ узнать, исходит ли конкретный IP-адрес от Tor или действует как выходной узел Tor?

Я хочу добавить в свой проект защиты от ботов метод, который допускает определенные правила. Одним из этих правил будет то, что текущий IP-адрес принадлежит Tor не потому, что соединения с Tor плохие, а скорее для предоставления возможностей настройки (например, отключения JS).

Я не могу найти бесплатное решение без ключа API, который был бы достаточно быстрым, чтобы удовлетворить требования. Список выхода Tor также, похоже, не содержит все IP-адреса, например некоторые IPv6-адреса.

Я нашел Tor Exonera: https://metrics.torproject.org/exonerator.html но, похоже, для него нет API.

Я не знаю бесплатного решения. Я знаю, что вы можете использовать API ip2location.io для обнаружения выходных узлов TOR и многих других прокси/VPN в плане безопасности.

Michael C. 27.05.2024 03:31
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение с помощью Можно ли добавить прокси после узла выхода TOR? , ссылка на эту статью в блоге: https://lists.torproject.org/pipermail/tor-project/2020-March/002759.html.

Ниже приведена реализация для Python:

import dns.resolver
import ipaddress

def reverse_ip(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        if isinstance(ip_obj, ipaddress.IPv4Address):
            return '.'.join(reversed(ip.split('.'))) + '.dnsel.torproject.org'
        elif isinstance(ip_obj, ipaddress.IPv6Address):
            return '.'.join(reversed(ip_obj.exploded.replace(':', ''))) + '.dnsel.torproject.org'
    except ValueError:
        raise ValueError("Invalid IP address format")

def is_tor_ip(ip):
    query = reverse_ip(ip)
    
    try:
        answers = dns.resolver.resolve(query, 'A')
        for rdata in answers:
            if rdata.to_text() == '127.0.0.2':
                return True
    except dns.resolver.NXDOMAIN:
        return False
    except dns.resolver.NoAnswer:
        return False
    except dns.exception.DNSException as e:
        print(f"DNS query failed: {e}")
        return False

    return False

print(is_tor_ip("185.220.101.25"))
print(is_tor_ip("2a0b:f4c2:1::1"))

Обращаем ваше внимание, что сегодня общедоступная служба TorDNSEL также не поддерживает IPv6, поэтому этот код не будет работать для IPv6. Существуют различные сервисы, которые публикуют списки адресов выхода Tor, которые ваше приложение может загрузить и проверить. Например www2.openinternet.io/tor/tor-exit-list.txt

drew010 28.05.2024 23:33

В ходе тестирования я обнаружил, что адреса IPv6 распознаются только в том случае, если они были предварительно разобраны.

TN3W 07.06.2024 16:15

Другие вопросы по теме