
Создание торговой панели администратора на MQL5 (Часть VII): Доверенный пользователь, восстановление и криптография
Содержание
- Введение
- Реализация доверенного пользователя в панели администратора
- Криптография и примеры применения в панели администратора
- Тестирование
- Заключение
Введение
Маркет MQL5 иллюстрирует важность идентификации устройства для обеспечения безопасности распространяемых продуктов. Наши текущие исследования мотивированы проблемами, с которыми мы столкнулись при работе с нашей безопасной панелью администратора. После внедрения усиленных мер безопасности процесс разработки и тестирования столкнулся с задержками из-за частых запросов на вход в систему и аутентификации, которые возникали при каждой компиляции файла или тестировании функций в терминале. Этот дополнительный уровень безопасности, хотя и необходим, внес трудности в наш рабочий процесс.
Предупреждение, показанное ниже, появляется на первой странице Маркета при публикации нового продукта. В нем подчеркивается, как MQL5 расставляет приоритеты и применяет надежные меры безопасности для защиты как разработчиков, так и пользователей.Каждая программа, продаваемая на Маркете, зашифрована специальным ключом, который защищает продукт от незаконного использования. Ключ шифрования уникален для каждого покупателя и привязан к его компьютеру, благодаря чему все товары на Маркете имеют автоматическую защиту от копирования.
Купленный Продукт можно активировать не менее пяти раз. Это обеспечивает баланс интересов покупателей и продавцов. Количество доступных активаций устанавливается продавцом.
Многие приложения и веб-сайты реализуют защиту второго уровня выборочно, активируя ее только при обнаружении подозрительной активности, например, использования анонимного IP-адреса, попыток входа с новых устройств или нескольких неудачных попыток входа. Такой подход сводит к минимуму перерывы в работе, обеспечивая при этом безопасность.
В нашем случае задержка тестирования во время разработки вызвана многократным вводом паролей и проверкой приложения Telegram на наличие сгенерированных 6-значных кодов. Частые подсказки могут стать утомительными, особенно если они вызваны изменениями активности терминала. Ниже приведены некоторые действия, которые приводят к повторной инициализации устройства и последующим запросам пароля:
- Смена пары
- Смена таймфрейма
- Перезагрузка терминала и т.п.
В некоторых сценариях наши программы повторно и неоднократно инициализируются из-за различных действий — процесс, который неизбежен по техническим или эксплуатационным причинам. Алгоритм проверки пользователя встроен в начало функции инициализации, что делает невозможным продолжение работы программы без прохождения этого шага. Однако мы можем ввести обходной механизм в функцию инициализации для оптимизации процесса. Этот обходной алгоритм отслеживает количество попыток входа в систему, обеспечивая более бесперебойную работу во время действительных сеансов.
Если количество неудачных попыток ввода пароля превышает установленный лимит, это сигнализирует о подозрительном поведении или указывает на то, что исходный пользователь мог потерять или забыть свой пароль. С другой стороны, если правильный пароль введен в течение трех попыток, система обходит 2FA, что существенно экономит время за счет избегания повторной аутентификации через Telegram. Такой подход повышает как безопасность, так и эффективность, особенно на этапах интенсивной разработки и тестирования.
На изображении ниже показана проблема отправки множественных проверочных сообщений в Telegram во время разработки приложения, что демонстрирует практическую необходимость этого усовершенствованного алгоритма.
Панель администратора: Персональный бот для доставки 2FA-кодов в Telegram
Раньше многократные запросы на ввод пароля и двухфакторную аутентификацию при каждой инициализации программы делали процесс чрезвычайно трудоемким. Чтобы сэкономить время при разработке, я добавил строку кода для вывода 6-значного проверочного кода, отправляемого в Telegram, непосредственно в журнале Expert терминала. Это позволило мне быстро извлечь код из журнала во время тестирования приложения без необходимости переключения на Telegram, что значительно упростило процесс.
Рассматриваемый фрагмент кода является частью функции, отвечающей за отправку сообщений Telegram. Для удобства я включил в него функцию регистрации сообщения в журнале. Однако на текущем этапе разработки я планирую удалить эту функцию, чтобы повысить безопасность в будущих версиях. Размещение конфиденциальной информации, например кодов проверки, в журнале может представлять угрозу безопасности в случае несанкционированного доступа. Этот шаг отражает баланс между оптимизацией процесса разработки и соблюдением передовых практик по защите конфиденциальных данных.
Фрагмент кода ниже показывает строку, которая выводит отправленное сообщение.
//+------------------------------------------------------------------+ //| Send the message to Telegram | //+------------------------------------------------------------------+ bool SendMessageToTelegram(string message, string chatId, string botToken) { string url = "https://api.telegram.org/bot" + botToken + "/sendMessage"; string jsonMessage = "{\"chat_id\":\"" + chatId + "\", \"text\":\"" + message + "\"}"; char postData[]; ArrayResize(postData, StringToCharArray(jsonMessage, postData) - 1); int timeout = 5000; char result[]; string responseHeaders; int responseCode = WebRequest("POST", url, "Content-Type: application/json\r\n", timeout, postData, result, responseHeaders); if (responseCode == 200) { Print("Message sent successfully: ", message); //This line prints the message in journal,thus a security leak that I used to bypass telegram during app tests. return true; } else { Print("Failed to send message. HTTP code: ", responseCode, " Error code: ", GetLastError()); Print("Response: ", CharArrayToString(result)); return false; } }
Ниже представлено сообщение, отправленное в Telegram, содержащее код подтверждения. Такой подход оказался удобным способом обойти проверку кода Telegram во время разработки. Однако, код создает серьезную угрозу безопасности, поскольку неавторизованные лица могут получить код непосредственно с терминала, не имея доступа к Telegram. Текст обычно отображается на вкладке "Эксперты" терминала:
Цель обсуждения:2024.11.22 08:44:47.980 Admin Panel V1.22 (Volatility 75 (1s) Index,M1) Message sent successfully: A login attempt was made on the Admin Panel. Please use this code to verify your identity: 028901 2024.11.22 08:44:48.040 Admin Panel V1.22 (Volatility 75 (1s) Index,M1) Password authentication successful. A 2FA code has been sent to your Telegram.
Целью данного обсуждения является интеграция надежной системы распознавания пользователей, которая оптимизирует процессы входа в систему и двухфакторной аутентификации (2FA). Пользователи, успешно введшие правильный пароль с трех попыток, могут обойти 2FA, тогда как превышение лимита активирует 2FA, требуя код, отправленный через Telegram, и жестко запрограммированный пароль для восстановления. Эта система сочетает удобство с безопасностью, ограничивая количество повторных попыток для предотвращения атак методом подбора паролей, одновременно обеспечивая бесперебойный процесс аутентификации. Доверие зависит от сеанса и требует повторной проверки при каждом новом входе в систему. В следующем разделе будут представлены дополнительные сведения о мерах противодействия брутфорс-атакам.
Что такое брутфорс (атака методом перебора)?
Атака методом перебора — это метод, используемый злоумышленниками для получения несанкционированного доступа к учетным записям, системам или зашифрованным данным путем систематического перебора всех возможных комбинаций паролей, ключей шифрования или учетных данных, пока не будет найдена правильная. Этот подход основан на вычислительной мощности и устойчивости, а не на использовании уязвимостей самой системы.
Основные характеристики атаки методом перебора:
- Метод проб и ошибок: Злоумышленник многократно пытается использовать различные комбинации символов, пока не получит доступ.
- Автоматизация: Для автоматизации процесса часто используются специализированные инструменты или скрипты, позволяющие совершать тысячи или даже миллионы попыток за короткий период.
- Большие затраты времени: Необходимое время зависит от сложности целевого пароля или ключа. Более надежные пароли с большим количеством символов и разнообразными комбинациями требуют значительно больше времени для взлома.
Типы атак методом перебора:
- Простой перебор - перебор всех возможных комбинаций символов.
- Атака по словарю - использование списка часто используемых паролей (например, "123456", "password" или "qwerty") для попытки доступа.
- Подстановка учетных данных - использование пар "имя пользователя-пароль", полученных в результате других взломов, для получения доступа к учетным записям на разных платформах.
Профилактика:
- Ограничение попыток входа в систему.
- Использование надежных паролей (длинных, содержащих заглавные и строчные буквы, цифры и символы).
- Внедрение двухфакторной аутентификации (2FA) для добавления еще одного уровня безопасности.
Текущая система безопасности доступа к панели уязвима для такой атаки, и хотя ограничение попыток входа в систему является важным шагом, мы также стремимся избегать частой аутентификации через Telegram, чтобы сэкономить время. Отправка проверочного кода служит для защиты от несанкционированного доступа и предупреждает администратора о любой потенциально вредоносной активности.
Реализация доверенного пользователя в панели администратора
Для реализации новой функции в панели администратора мы изменили лишь несколько разделов нашего исходного кода, связанных с безопасностью и инициализацией программы советника. Такой подход гарантирует неизменность остальной части программы, сводя к минимуму риск ошибок при управлении большим кодом. Основное внимание здесь уделяется функции обработчика входа в систему, и мы ввели новые переменные, которые объявлены в следующем фрагменте кода.
int failedAttempts = 0; // Counter for failed login attempts bool isTrustedUser = false; // Flag for trusted users
Глобальные переменные failedAttempts и isTrustedUser имеют решающее значение для реализации новых функций. failedAttempts отслеживает количество неверных вводов паролей и помогает определить, когда следует применять. Флаг isTrustedUser распознает пользователей, которые успешно вошли в систему в течение разрешенных попыток, пропуская для них процесс 2FA. Путем соответствующей переустановки этих переменных в функции OnLoginButtonClick система осуществляет динамический контроль над потоком аутентификации, обеспечивая гибкость и безопасность.
Улучшение функции входа в систему для новых функций
Функция OnLoginButtonClick интегрирует новые возможности, отслеживая попытки входа в систему с помощью счетчика failedAttempts и идентифицируя доверенных пользователей с помощью флага isTrustedUser. При вводе правильного пароля система проверяет, можно ли считать пользователя доверенным, если количество неудачных попыток ввода пароля не превышает трех. Доверенные пользователи пропускают этап 2FA и переходят сразу на главную панель администратора. Если количество неудачных попыток превышает лимит, функция генерирует код 2FA, отправляет его пользователю через Telegram вместе с жестко заданным паролем для восстановления и показывает запрос на 2FA-аутентификацию. Это обеспечивает баланс между удобством для доверенных пользователей и усиленной безопасностью после неудачных попыток.
//+------------------------------------------------------------------+ //| Handle login button click | //+------------------------------------------------------------------+ void OnLoginButtonClick() { string enteredPassword = passwordInputBox.Text(); if (enteredPassword == Password) { failedAttempts = 0; // Reset attempts on successful login isTrustedUser = true; if (failedAttempts <= 3) // Skip 2FA for trusted users { authentication.Destroy(); adminHomePanel.Show(); Print("Login successful. 2FA skipped for trusted user."); } else { } } else { failedAttempts++; feedbackLabel.Text("Wrong password. Try again."); passwordInputBox.Text(""); if (failedAttempts >= 3) { Print("Too many failed attempts. 2FA will be required."); twoFACode = GenerateRandom6DigitCode(); SendMessageToTelegram( "A login attempt was made on the Admin Panel.\n" + "Use this code to verify your identity: " + twoFACode + "\n" + "Reminder: Your admin password is: " + Password, Hardcoded2FAChatId, Hardcoded2FABotToken ); authentication.Destroy(); ShowTwoFactorAuthPrompt(); Print("Password authentication successful. A 2FA code has been sent to your Telegram."); failedAttempts = 0; // Reset attempts after requiring 2FA } } }
Пять шагов во время инициализации программы
Процесс аутентификации, включая новые возможности пропуска 2FA, вступает в силу во время инициализации, поскольку функция ShowAuthenticationPrompt() отображает интерфейс входа в систему, где обработчик OnLoginButtonClick связан с кнопкой Login. Вот как это работает шаг за шагом:
- Запуск запроса аутентификации: В функции OnInit() первым вызывается ShowAuthenticationPrompt(). Функция создает и отображает диалоговое окно аутентификации, содержащее поле ввода пароля и кнопку Login. Программа приостанавливает дальнейшее выполнение до тех пор, пока пользователь не взаимодействует с диалоговым окном.
- Обработка попыток входа: Когда пользователь нажимает кнопку Login, выполняется функция OnLoginButtonClick. Функция проверяет введенный пароль, обновляет счетчик failedAttempts и определяет, предоставлять ли доступ напрямую или применять 2FA на основе количества неудачных попыток.
- Продолжение после успешной аутентификации: Если вход в систему выполнен успешно и пользователь соответствует критериям доверенного (менее трех неудачных попыток), диалоговое окно аутентификации закрывается и немедленно отображается домашняя панель администратора. Это позволяет обойти 2FA для доверенных пользователей.
- Требование 2FA при необходимости: Если пользователь превышает допустимое количество неудачных попыток, программа применяет 2FA. Генерируется 6-значный код, который отправляется через Telegram, а диалоговое окно аутентификации 2FA отображается с помощью функции ShowTwoFactorAuthPrompt(). Запомните функцию генерации нашего цифрового кода, выделенную красным цветом.
//+------------------------------------------------------------------+ //| Generate a random 6-digit code for 2FA | //+------------------------------------------------------------------+ string GenerateRandom6DigitCode() { int code = MathRand() % 1000000; // Generate a 6-digit number return StringFormat("%06d", code); // Ensure leading zeros }
5. Дальнейшая инициализация: После аутентификации пользователя (с помощью доверенного входа или успешной двухфакторной аутентификации (2FA)) остальные панели (главная панель администратора, панель коммуникаций, панель управления торговлей) инициализируются в фоновом режиме, но остаются скрытыми до тех пор, пока не будут явно отображены во время навигации.
Вот фрагмент кода функции инициализации:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (!ShowAuthenticationPrompt()) { Print("Authorization failed. Exiting..."); return INIT_FAILED; } if (!adminHomePanel.Create(ChartID(), "Admin Home Panel", 0, 30, 30, 500, 500)) { Print("Failed to create Admin Home Panel"); return INIT_FAILED; } if (!CreateAdminHomeControls()) { Print("Home panel control creation failed"); return INIT_FAILED; } if (!communicationsPanel.Create(ChartID(), "Communications Panel", 0, 30, 30, 500, 500)) { Print("Failed to create Communications panel dialog"); return INIT_FAILED; } if (!tradeManagementPanel.Create(ChartID(), "Trade Management Panel", 0,260, 30, 1040, 170)) { Print("Failed to create Trade Management panel dialog"); return INIT_FAILED; } if (!CreateControls()) { Print("Control creation failed"); return INIT_FAILED; } if (!CreateTradeManagementControls()) { Print("Trade management control creation failed"); return INIT_FAILED; } adminHomePanel.Hide(); // Hide home panel by default on initialization communicationsPanel.Hide(); // Hide the Communications Panel tradeManagementPanel.Hide(); // Hide the Trade Management Panel return INIT_SUCCEEDED; }
Криптография и примеры применения в панели администратора
Криптография в MQL5 подразумевает использование алгоритмов и методов для защиты конфиденциальных данных, таких как пароли, сообщения или коды аутентификации.
Ниже приведены четыре способа применения этой концепции в панели администратора.
1. Хеширование паролей
- Функция HashPassword использует функцию CryptEncode с алгоритмом CRYPT_HASH_SHA256 для хеширования вводимого пароля. Хешированный результат преобразуется в шестнадцатеричную строку с помощью CharArrayToHex для хранения или сравнения. В функции VerifyPassword введенный пароль хешируется и сравнивается с сохраненным хешем, гарантируя, что никакие пароли в виде открытого текста не сохраняются и не обрабатываются.
- Хранение хешированных паролей гарантирует, что даже в случае несанкционированного доступа к сохраненным данным сами пароли останутся в безопасности. Хеширование является односторонним, то есть исходный пароль невозможно получить из хеша, что добавляет существенный уровень безопасности к аутентификации.
// Example for storing our hard-coded password string HashPassword(string password) { uchar hash[]; CryptEncode(CRYPT_HASH_SHA256, password, hash); return CharArrayToHex(hash); } // Usage string PasswordHash = HashPassword("2024"); // Store this instead of plaintext bool VerifyPassword(string enteredPassword) { return HashPassword(enteredPassword) == PasswordHash; }
2. Шифрование конфиденциальных данных
- Функция EncryptData использует алгоритм AES-256 (CRYPT_AES256) для шифрования конфиденциальной информации, такой как коды 2FA, с использованием безопасного ключа шифрования. Функция DecryptData разворачивает этот процесс, расшифровывая данные обратно в их первоначальный вид. Ключ имеет решающее значение в этом процессе, поскольку он должен совпадать во время шифрования и дешифрования.
- Шифрование защищает конфиденциальные данные во время хранения или передачи. Например, если код 2FA будет перехвачен во время коммуникации, зашифрованная версия гарантирует, что неавторизованные пользователи не смогут интерпретировать его без правильного ключа.
//Example for encryption of our 2FA verification code string EncryptData(string data, string key) { uchar encrypted[]; CryptEncode(CRYPT_AES256, data, encrypted, StringToCharArray(key)); return CharArrayToHex(encrypted); } string DecryptData(string encryptedData, string key) { uchar decrypted[]; uchar input[]; StringToCharArray(encryptedData, input); CryptDecode(CRYPT_AES256, input, decrypted, StringToCharArray(key)); return CharArrayToString(decrypted); } // Usage string key = "StrongEncryptionKey123"; // Use a secure key string encrypted2FA = EncryptData(twoFACode, key); Print("Encrypted 2FA code: ", encrypted2FA);
3. Безопасная генерация случайных чисел для 2FA
- Функция GenerateSecureRandom6DigitCode использует функцию CryptEncode с алгоритмом CRYPT_HASH_SHA256 для генерации криптографически безопасной случайной последовательности. Затем результат преобразуется в 6-значное число с использованием модульной арифметики и форматирования.
- Стандартные случайные функции, такие как MathRand, являются псевдослучайными и предсказуемыми. Использование криптографической случайности гарантирует, что коды 2FA являются надежными и устойчивыми к прогнозированию или атакам методом подбора, что повышает безопасность процесса аутентификации.
// Example for generating a secure verification code string GenerateSecureRandom6DigitCode() { uchar randomBytes[3]; CryptEncode(CRYPT_HASH_SHA256, MathRand(), randomBytes); // Use CryptEncode for randomness int randomValue = (randomBytes[0] << 16) | (randomBytes[1] << 8) | randomBytes[2]; randomValue = MathAbs(randomValue % 1000000); // Ensure 6 digits return StringFormat("%06d", randomValue); }
4. Безопасная связь с Telegram
- Функция SendEncryptedMessageToTelegram шифрует сообщение с помощью функции EncryptData перед передачей ее на сервер Telegram с помощью функции SendMessageToTelegram. Расшифровать зашифрованное сообщение может только тот, кто обладает правильным ключом дешифрования.
- Шифрование связи обеспечивает конфиденциальность информации, такой как коды 2FA, даже если передача будет перехвачена. Это особенно важно при использовании сторонних коммуникационных платформ, где данные могут быть защищены не полностью.
//Example of the securely sending to Telegram bool SendEncryptedMessageToTelegram(string message, string chatId, string botToken, string key) { string encryptedMessage = EncryptData(message, key); return SendMessageToTelegram(encryptedMessage, chatId, botToken); } // Usage string key = "StrongEncryptionKey123"; SendEncryptedMessageToTelegram("Your 2FA code is: " + twoFACode, Hardcoded2FAChatId, Hardcoded2FABotToken, key);
Тестирование
На этом этапе мы представим результаты наших улучшений безопасности на панели администратора. Обновление упрощает процесс входа в систему для доверенных пользователей, позволяя им быстро получать доступ к панели, в то время как недоверенным пользователям необходимо пройти повторную проверку для подтверждения своей подлинности. Если пользователь забыл свой пароль, он может восстановить его с помощью аутентификации.
В журнале Experts ниже мы показываем неудачные попытки входа в систему, а также процесс входа в систему.
2024.11.22 03:53:59.675 Admin Panel V1.23 (Volatility 75 (1s) Index,M2) Too many failed attempts. 2FA will be required. 2024.11.22 03:54:00.643 Admin Panel V1.23 (Volatility 75 (1s) Index,M2) Message sent successfully: Check your telegram for verification code and Password 2024.11.22 03:54:00.646 Admin Panel V1.23 (Volatility 75 (1s) Index,M2) Password authentication successful. A 2FA code has been sent to your Telegram. 2024.11.22 03:54:22.946 Admin Panel V1.23 (Volatility 75 (1s) Index,M2) 2FA authentication successful. Access granted to Admin Home Panel.
Telegram-сообщение отправлено на проверку
Панель администратора: неудачные попытки входа
Для доверенных пользователей процесс входа в систему прост. Они могут обойти этап вторичной проверки, упростив свой доступ к панели администратора. Ниже представлен журнал Experts, показывающий успешный вход в систему для доверенных пользователей, а также сам процесс для тех, кто ввел правильный пароль.2024.11.22 03:57:41.563 Admin Panel V1.23 (Volatility 75 (1s) Index,M2) Login successful. 2FA skipped for trusted user.
Панель администратора: Успешный вход доверенного пользователя с паролем
Заключение
В ходе усовершенствования панели администратора мы добились значительных успехов как в плане функциональности, так и безопасности. Введение функции доверенного пользователя обеспечивает более плавный и эффективный процесс входа в систему для известных пользователей за счет ограничения количества попыток входа до трех и обхода 2FA для успешной аутентификации в пределах этого порога. Такой подход обеспечивает баланс между безопасностью и удобством использования, уменьшая помехи для пользователей и одновременно сохраняя строгие меры контроля доступа.
Мы также изучили потенциал криптографии для укрепления безопасности панели. Используя хеширование паролей, шифрование конфиденциальных данных и безопасную генерацию случайных чисел для кодов 2FA, мы обеспечили целостность и конфиденциальность критически важной информации. Хеширование защищает сохраненные пароли от несанкционированного доступа, а шифрование защищает конфиденциальные данные во время передачи или хранения. Кроме того, криптографически безопасная случайность обеспечивает непредсказуемость генерируемых кодов, добавляя дополнительный уровень защиты от атак методом подбора.
Эти усовершенствования помогают нам обеспечить удобный и безопасный инструмент управления торговыми коммуникациями и операциями. Уделяя внимание как функциональности, так и безопасности, мы закладываем основу для будущих улучшений, которые могут еще больше оптимизировать рабочие процессы, соблюдая при этом самые высокие стандарты защиты данных.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/16339
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования