Выпущена версия 21.4.1, в этой версии присутствует несколько больших изменений:
Действие 'Прокси' теперь не только меняет прокси, но и делает так, чтобы смена прокси выглядела более правдоподобно.
Работа в основном окне программы (оно черного цвета) теперь происходит более интуитивно.
Исправлен один очень неприятный баг связанный с несвоевременным освобождением памяти при работе с одним браузером на протяжении долгого времени.
Давайте рассмотрим каждое изменение более подробно.
Для начала немного информации про WebRTC, так как этот функционал встроен в любой современный браузер, а с помощью него можно получить данные о реальном ip даже используя прокси. WebRTC - набор апи, которые помогают устанавливать соединение между браузерами и передавать между ними информацию. Причем предпочтение отдается именно прямому соединению, и только если оба браузера находятся за фаерволом или NAT, то используется специальный сервер чтобы передавать трафик через него. Установить соединение бывает непросто учитывая то, что ipv4 адресов недостаточно для всех устройств и большинство из них находятся в приватных сетях, имеют адреса вида 192.168.*.* или 172.16.*.* и обмениваются информацией с остальными через NAT. WebRTC использует такой алгоритм чтобы установить соединение - сначала устройства получают информацию о конфигурации своих сетей и обмениваются ей через какой-то другой канал, потом они пытаются соединиться используя разные варианты конфигурации. Допустим, если устройства находятся в одной сети, то для установления соединения достаточно использовать ip в этой сети, если одно из устройств имеет внешний ип, то оно выступает в роли "сервера" и к нему подключается второе устройство, или наоборот. Нам интересна как раз конфигурация сети, поскольку она содержит реальные ip адреса. WebRTC допускает ее чтение, и даже редактирование через javascript перед отправкой собеседнику. Информация имеет формат SDP описанный в данных документах
RFC 5245 - Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols RFC 4566 - SDP: Session Description Protocol. По следующей ссылке ее можно получить через ваш браузер
Edit fiddle - JSFiddle, скорее всего там есть ваш реальный ip. В качестве одного из параметров данной информации выступает внешний ip браузера, он получается через запрос к STUN серверу. Функционал данного сервера очень прост - возвращать устройству сделавшему запрос его реальный ip адрес. Сайт сам задает STUN сервер, который хочет использовать, например, в коде выше использовался такой сервер stun.l.google.com:19302. Запросы к этому серверу идут через протокол UPD(вместо TCP) минуя прокси. Суммируя вышесказанное, javascript может совершать запрос к произвольному серверу без прокси и получать ответ в виде реального внешнего ip. Вот ссылка на хорошую статью если вы хотите ознакомиться с вопросом более детально
WebRTC in the real world: STUN, TURN and signaling - HTML5 Rocks
До недавнего времени в BAS использовался алгоритм, который запрещает любые запросы подобного рода. В данной версии, BAS изменяет ip полученный от сервиса на внешний ip текущего прокси, это происходит по умолчанию при использовании действия 'Прокси', тем не менее новый функционал можно отключать в этом же действии. Рассмотрим детали реализации:
1) Подмена ip происходит на уровне браузера, через js обнаружить ее невозможно.
2) Разные браузеры могут выдавать информацию в формате SDP, тем не менее немного отличающуюся. Подмена может осуществлятся через замену текста, и такой метод можно обнаружить проверив некоторые детали специфичные для браузера. BAS выдает информацию именно так, как это делает Chrome, без замены текста.
3) Запросы к любому STUN серверу запрещены. Даже если запретить получение информации непосредственно через js, но оставить возможность браузеру делать запрос к серверу, то реальный ip не будет известен клиенту, но будет известен серверу и если настроить несколько серверов или несколько портов и связать пользователя с конкретным сервером, то ip можно получить уже на стороне клиента. BAS защищает от подобного метода.
Есть простой метод, как можно проверить, пытается ли сайт получить ваш ip через WebRTC или нет, достаточно установить Wireshark, в поле фильтра установить строку stun и зайти на сайт, в случае использования WebRTC в окне приложения будут запросы. Вот видео, которое это демонстрирует:
В случае BAS, запросов не будет, хоть ip и будет возвращаться.
Почему бы не сделать запросы к STUN серверу через туннелирование?
Дело в том, что не все прокси поддерживают протокол UPD, хотя это и указано в спецификации. Пример такого прокси
В будущем BAS будет проверять прокси на такую возможность, но сейчас все запросы к STUN серверу запрещены.
Как видите, данная реализация хоть и не является идеальной, но достаточно близка к ней.
Кроме этого, действие 'Прокси' теперь также умеет автоматически изменять геолокацию и часовой пояс браузера.
Изменение часового пояса теперь также происходит на уровне браузера - абсолютно все даты, которые возвращает браузер теперь имеют часовой пояс точно такой же, как и у прокси.
BAS научился корректно возвращать измененную дату с учетом летнего времени.
Еще один способ, которым можно обнаружить примерное реальное месторасположение является использование internationalization api(
Intl.DateTimeFormat ). Пример использования:
Edit fiddle - JSFiddle, по ссылке должно отобразится ваше примерное реально месторасположение независимо от прокси и впн.
Эти значения также заменяются при использовании действия 'Прокси', вы можете убедится в этом зайдя на данную страницу из BAS.
Наконец, бывают ситуации, когда ip, который вы используете для доступа к прокси не соответствует его внешнему ip, в таких случаях BAS будет получать внешний ip через сервис ip.bablosoft.com. К сожалению, не существует способа получить адрес без сетевого запроса. Сервис должен стабильно работать при 20к запросах в секунду. Настройка отключаема.
Немало внимания в новом апдейте было уделено удобству использования основного окна.
Для элементов, значение которых может быть не совсем понятным, появились подсказки.
Реализовано множество удобных мелочей: список недавних проектов теперь находится всегда на основной панели, путь к текущему проекту можно скопировать, все иконки заменены на такие, что смотрятся лучше при маленьком размере элементов, изменены значки запущенных браузеров.
Добавлена возможность быстрого обмена проектами - открытие проекта по ссылке и загрузка на гугл диск.
Обновлено окно компиляции проекта, оно стало более интуитивным и интегрированным с облаком. Теперь проект можно обновлять/создавать прямо из BAS, появилась возможность не создавать архив при каждой компиляции.
Было потрачено много времени на поиск причины и исправление бага с несвоевременным освобождением памяти. Баг существовал все время на протяжении жизни проекта и проявлялся только тогда, когда несколько браузеров работали 10 и больше часов без перезапуска. Потребление памяти увеличивалось приблизительно на 5-10 мб в час, через несколько дней непрерывной работы проект становился неработоспособным. Ошибка была связана с библиотекой Qt, был найден метод как обойти этот баг.
Надеюсь, что новая версия вам понравится и будет полезной!