Тестовое задание для НеоБИТ: Разработать веб-сайт проверки анонимности веб-браузера, который позволит распознать пользователя даже после смены браузера или настройки прокси/VPN/TOR.
Веб-приложение: https://qlvz.pythonanywhere.com
Иногда загрузка может быть долгой из-за проверки VPN (Проблема описана ниже в разделе VPN)
На странице отображаются:
- IP-адрес
- Посещалась ли страница ранее
- Использование прокси (не всегда определяет)
- Использование VPN
- Использование TOR
- Наличие HTTP-заголовков прокси-серверов
- Предупреждение при наличии системного времени и времени на основании IP-адреса
Адрес получается через библиотеку Ipware
Определяется по совокупности факторов, используются куки, проверка user_agent и данные в БД. При обнаружении какого-либо из факторов может выдаваться
результат Traces found
.
Определяется по наличию заголовков прокси, т.е. если нет заголовков в запросе - данное поле также будет False Наличие заголовков не всегда способно однозначно определить наличие прокси, поэтому могут быть ложные несрабатывания.
Определяется с помощью данных с сервиса IpQualityScore.
!ВАЖНО!
Так как приложение размещено на сервисе PythonAnywhere и используется бесплатный тарифный план хостинга,
то имеются ограничения: через requests.get()
можно отправлять запросы только на сайты из списка
Whitelist.
В списке есть GitHub, поэтому я создал страницу для переадресации API с сервиса IQS на небольшой
ByPass, рамещенный на Github Pages.
Данное решение также может быть использовано для других API (при необходимости).
Из-за использования данного обхода загрузка страницы может быть дольше, чем того бы хотелось 🙃
Определяется через готовый список известных Exit-адресов сервиса TOR. В моем случае список хранится в файле из-за описаного ранее ограничения по requests-запросам на PythonAnywhere.
Заголовки хранятся в списке, далее проверяется их наличие в заголовках в теле запроса. При совпадении выводится результат True
Дополнительно проверяется локальное системное время и время, основанное на временной зоне IP-адреса. При несовпадении может выдаваться предупреждение.
Также, такой параметр может быть косвенным фактором использования средств сокрытия IP-адреса.
Для нахождения времени по IP определяем временную зону пользователя (используем ранее описанный ByPass, так как IQS содержит много полезной информации)
и далее, через pytz.timezone
получаем время.
Использованные технологии:
- Python
- Django
- Ipware
- Asyncio
- Pyppeteer
- Request-html
- Pytz
- Chromium
- HTML
- JavaScript
- Bootstrap