From 6041e979f43dfe1c8b33dca676fdd5a6fd960ac1 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 11 May 2025 15:41:33 +0300 Subject: [PATCH] fix: ip validation --- src/DosAtk.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 801bb75..08939e1 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -87,8 +87,14 @@ int my_check_params() const char* short_options; // Сокращения для параметров struct option long_options[10]; // Структура, описывающая пеобходимые программе параметры int i; // Счётчик для цикла + std::string token; + bool is_valid_ip; + int count; // Инициализация + count = 0; + is_valid_ip = true; + token = ""; ms = std::chrono::duration_cast(start_timestamp.time_since_epoch()) % 1000; opt = -1; short_options = "a:d:i:p:l:t:b:h"; @@ -165,6 +171,45 @@ int my_check_params() } } + std::istringstream ss(ip); + + while (std::getline(ss, token, '.')) { + // Check number of parts + if (++count > 4) { + is_valid_ip = false; + break; + }; + + // Check if token is a number + if (token.empty() || token.size() > 3) { + is_valid_ip = false; + break; + }; + + for (char c : token) { + if (!isdigit(c)) { + is_valid_ip = false; + break; + }; + } + + int num = std::stoi(token); + if (num < 0 || num > 255) { + is_valid_ip = false; + break; + }; + + // Optional: Disallow leading zeros + if (token.size() > 1 && token[0] == '0') { + is_valid_ip = false; + break; + }; + } + + if(is_valid_ip) { + is_valid_ip = count == 4; + } + if (attack_type != "flood" && attack_type != "scan") { // Проверяем валидность типа атаки printf("end my_check_params\n"); // debug return -1; // Некорректный тип атаки @@ -181,13 +226,14 @@ int my_check_params() (telegram_id.empty() && !telegram_token.empty())) { // Если указан telegram id то нужен и token printf("end my_check_params\n"); // debug return -600; // Неполные данные для Telegram - } - else if (attack_type == "scan") { // Если все проверки пройдены и тип атаки - сканирование + } else if(!ip.empty() && !is_valid_ip) { + printf("end my_check_params\n"); // debug + return -601; // Введён неправильный ip + } else if (attack_type == "scan") { // Если все проверки пройдены и тип атаки - сканирование log_msg += " | Type: UDP port scan"; printf("end my_check_params\n"); // debug return 1; // Валидные параметры для сканирования } - else if (attack_type == "flood") { // Если все проверки пройдены и тип атаки - флуд log_msg += " | Type: TCP SYN flood"; printf("end my_check_params\n"); // debug @@ -330,9 +376,13 @@ void my_diag() log_msg += " | Error: Unknown option"; break; case -600: // Неполные данные для Telegram-уведомлений - printf("Error: To use telegram integration both telegram_id and telegram_token have to be provided!\n.--help for info\n"); + printf("Error: To use telegram integration both telegram_id and telegram_token have to be provided!\n--help for info\n"); log_msg += " | Error: To use telegram integration both telegram_id and telegram_token have to be provided"; break; + case -601: // Неверный ip + printf("Error: Invalid ip address!\n--help for info\n"); + log_msg += " | Error: Invalid ip address provided by user"; + break; } printf("end my_diag\n"); // debug @@ -1038,6 +1088,7 @@ int main(int arg_ctr, char **arg_ptr) case -20: case -101: case -600: + case -601: my_diag(); // Выводим диагностику status = my_log(); // Логируем событие