Я хочу добавить в свой проект защиты от ботов метод, который допускает определенные правила. Одним из этих правил будет то, что текущий IP-адрес принадлежит Tor не потому, что соединения с Tor плохие, а скорее для предоставления возможностей настройки (например, отключения JS).
Я не могу найти бесплатное решение без ключа API, который был бы достаточно быстрым, чтобы удовлетворить требования. Список выхода Tor также, похоже, не содержит все IP-адреса, например некоторые IPv6-адреса.
Я нашел Tor Exonera: https://metrics.torproject.org/exonerator.html но, похоже, для него нет API.
Я нашел решение с помощью Можно ли добавить прокси после узла выхода 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
В ходе тестирования я обнаружил, что адреса IPv6 распознаются только в том случае, если они были предварительно разобраны.
Я не знаю бесплатного решения. Я знаю, что вы можете использовать API ip2location.io для обнаружения выходных узлов TOR и многих других прокси/VPN в плане безопасности.