Онлайн демонстрации

From SunFlurry wiki
Jump to: navigation, search

Онлайн демонстрации, доступные в этой документации, создают запросы к консольному клиенту, который не имеет доступа к базе данных. HTTP-сервер (Apache в данном случае) служит proxy-провайдером для этих запросов. Это позволяет не открывать входящий порт консольного клиента в Интернет, он может работать с любого сервера в локальной сети proxy-провайдера, который может содержать защиту от атак доступности сервиса или черный список.

Однако, чтобы продемонстрировать возможности создания защиты с помощью самого клиента, в его проекте создана и работает особая программа, создающая защиту от DOS или DDOS атак онлайн примеров с помощью широко используемого в интернете теста Captcha. Тест Captcha вставляется в момент попытки пользователя выполнить один из онлайн примеров, если количество обращений к примеру достигнет определенного числа попыток. Если пользователь решает показанный ему тест, счетчик попыток обнуляется, иначе тест будет показан снова и снова, и, в конечном итоге IP пользователя будет заблокирован на определенное время. Ниже дан более подробный алгоритм работы:

  • До начала цикла работы, программа клиента создает таблицу ВходящиеСоединения, которая будет содержать информацию по входящим IP адресам и их статусу.
  • Для уменьшения общей нагрузки на систему, на которой работает консольный клиент, входящий порт открывается с помощью функции ListenEx.
  • При поступлении нового соединения (от Apache proxy сервера), клиент читает http заголовок и находит значение поля X-Forwarded-For. В этом поле Apache сервер сохраняет оригинальный IP-адрес входящего соединения.
  • Программа находит полученный IP-адрес в таблице ВходящиеСоединения (либо добавляет его туда, если он не найден), и проверяет его статус.
    • Если IP-адрес заблокирован, программа разрывает соединение, Apache сервер также разрывает соединение с реальным клиентом.
    • Если IP-адрес не заблокирован, но для него инициирован тест Captcha, число попыток решения теста увеличивается на единицу и, если оно превысило определенный порог, на IP-адресе устанавливается флаг блокировки и связь разрывается.
    • Для остальных IP-адресов ведутся переменные: общее количество соединений и количество соединений за последнюю минуту. Если одно или второе значение достигает порога, для адреса инициируется тест Captcha с числом попыток равным нулю.
  • Программа продолжает разбор заголовка полученного http-пакета. В данном случае, она проверяет, к какому ресурсу происходит обращение. Для программы Javascript в браузере, кроме стандартных запросов к онлайн демонстрациям, выделено два дополнительных запроса к Captcha функциям:
    • ?CaptchaReq: браузер пользователя проверяет необходимость решения теста Captcha. Если для IP-адреса не инициирован тест Captcha, программа возвратит ответ 200 OK и разорвет соединение (это будет говорить программе Javascript в браузере о том, что нет необходимости решать тест и можно отправить запрос по выполнению требуемой онлайн демонстрации). Если же для IP-адреса инициирован тест Captcha, программа возвратит ответ 403 Forbidden и отдаст тест Captcha в теле ответа (о создании теста см. ниже).
    • ?CaptchaSolve: браузер пользователя передает ответ пользователя на тест Captcha. Если для IP-адреса не инициирован тест Captcha, это говорит о какой-то ошибке синхронизации, либо о том, что с данного IP-адреса работает более одного пользователя. В этом случае, программа возвратит ответ 200 OK и разорвет соединение (это будет говорить программе Javascript в браузере о том, Captcha решена успешно (хотя она даже не проверялась) и можно отправить запрос по выполнению требуемой онлайн демонстрации). Если же для IP-адреса инициирован тест Captcha, программа продолжит расшифровку запроса, и, получив из строки запроса переменную Answer, проверит соответствие решения пользователя сохраненному за данным IP-адресом решению теста Captcha (описание здесь несколько упрощено для лучшего понимания). В случае, если решения...
      • ...совпадают, программа возвратит ответ 200 OK, снимет с IP-адреса признак необходимости решения теста Captcha и разорвет соединение (это будет говорить программе Javascript в браузере о том, что Captcha решена успешно и можно отправить запрос по выполнению требуемой онлайн демонстрации).
      • ...не совпадают, программа увеличит счетчик неверного решения теста Captcha, и если этот счетчик больше порогового значения, установит на клиенте признак блокировки и разорвет связь; в ином случае, программа возвратит ответ 403 Forbidden и отдаст новый тест Captcha в теле ответа (о создании теста см. ниже).
  • Если входящий пакет не содержит ни одного из запросов Captcha, программа проверит, инициирован ли этот тест для данного IP-адреса. Если тест не инициирован, будет загружен модуль соответствующей демонстрации в новом потоке, и ему будет передано текущее соединение. Если тест, инициирован, программа возвратит ответ 403 Forbidden и отдаст новый тест Captcha в теле ответа (о создании теста см. ниже).
  • В этом же рабочем цикле, программа очищает флаги Captcha и блокировки с IP-адресов в зависимости от времени, прошедшего с момента их последнего соединения (последнего чтения заголовка http пакета). Если для IP-адреса с блокировкой прошло 4 часа, этот адрес удаляется из таблицы. При попытке нового соединения с этого адреса, он будет считаться чистым и сможет пользоваться сервисами системы.


Создание теста Captcha

Для создания нового теста, программа случайным образом подбирает фразу теста состоящую из ограниченного алфавита, включающего буквы, цифры и знаки с таким расчетом, чтобы при их вращение на 90° в любую сторону знак не был похож на другие знаки алфавита. После этого, программа вызывает новый поток, чтобы не задерживать генерацией картинки теста возможных новых клиентов. В новом потоке программа создает пустую картинку с фиксированным разрешением и, для каждой буквы фразы решения, подбирает случайным образом: шрифт (из фиксированного набора), его размер (из диапазона размеров), свойства шрифта (наклон, жирность, сглаживание и пр.), его цвет, наносит каждую получившуюся букву на результирующую картинку, искажая ее с помощью функции TransformPicture. После вывода букв, программа добавляет случайные линии и овалы, чтобы усложнить работу программам автоматического решения таких тестов. Картинка переводится в формат png, кодируется в base64 и отправляется по ожидающему соединению, после чего соединение разрывается. Пример создаваемой картинки показан на рис. 1.

Доступные онлайн демонстрации

Данная документация содержит две онлайн демонстрации, использующие возможности работы с HTTP пакетами, штрихкодами и 2D символами, исполнения кода, и вывода результата в веб):

  • Демонстрация генерации штрихкодов и символов позволяет получить доступ к возможностям функций Generate1DBarcode и Generate2DBarcode непосредственно с веб страницы. Страница содержит краткое описание алгоритма работы запроса и ответа. Демонстрация использует XMLHttpRequest объект Javascript на стороне браузера. При отсутствии теста Captcha, можно было бы обойтись получением HTTP пакета с png картинкой внутри.
  • Демонстрация исполнения произвольного программного кода позволяет проверить возможности функции ExecEx. При исполнении кода в отдельном потоке, на него накладываются дополнительные ограничения для обеспечения безопасности консольного клиента. Процедура исполнения не только ограничена по времени, но и многие опасные функции запрещены к использованию. Весь вывод в лог клиента (в том числе вывод информации об ошибках) перехватывается и направляется на веб страницу, кроме вывода текста, исполняемая программа может отдавать результат в виде картинки, которая тоже будет показана на странице. Страница содержит краткое описание алгоритма работы запроса и ответа. Демонстрация использует XMLHttpRequest объект Javascript на стороне браузера.

Кроме онлайн демонстраций на сайте доступна демонстрационная версия визуального клиента, соединяющаяся с помощью интернета к базе данных, содержащей тестовые данные. Для работы, данную демонстрацию необходимо скачать в виде файла установки и запустить его на локальном компьютере. После установки у Вас появляется возможность работать с тестовой базой данных проекта "Торговля и производство". Так как работа будет происходить с пакетами, передаваемыми по сети интернет, скорость передачи которой гораздо ниже, чем скорость передачи по локальной сети, а проект предназначен для работы по локальной сети, скорость работы будет сильно замедлена и будет зависеть от скорости передачи пакетов между сервером базы данных и Вашим локальным компьютером. Дополнительное описание ищите на странице скачивания демонстрационной версии.