Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38

Разрешение доступа клиенту по ip и маске

07.06.2023, 23:33. Показов 1183. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет форумчанам.
Нужна помощь.

Пытаюсь разрешить доступ клиенту по ip из определенных подсетей, с помощъю cidr-маски.
Вот код функции:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int isIPInCIDR(const char* ipAddress, const char* cidr) {
    puts("start isIPInCIDR\n");
    printf("ipAddress: %s\n",ipAddress);
    printf("cidr: %s\n",cidr);
    
    struct in_addr addr;
    struct in_addr network;
    struct in_addr netmask;
 
    if (inet_pton(AF_INET, ipAddress, &addr) <= 0) {
    char ipAddress[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(addr), ipAddress, INET_ADDRSTRLEN);
    printf("IP Address structure: %s\n", ipAddress);
        // Некорректный IP-адрес
        printf("Некорректный IP-адрес ipAddress %s\n",ipAddress);
        return 0;
    }
 
char networkAddress[INET_ADDRSTRLEN];
    if (inet_pton(AF_INET, cidr, &network) <= 0) {
        // Некорректный CIDR-префикс
        fprintf(stderr, "Error converting CIDR prefix: %s\n", strerror(errno));
        perror("error converting network structure");
        printf("Некорректный CIDR-префикс \n");
        return 0;
    }
inet_ntop(AF_INET, &(network.s_addr), networkAddress, INET_ADDRSTRLEN);
printf("Network Address structure: %s\n", networkAddress);
 
 
 
    int prefixLength;
    if (sscanf(cidr, "%*[^/]/%d", &prefixLength) != 1) {
        // Некорректный формат CIDR-префикса
        printf("Некорректный формат CIDR-префикса \n");
        return 0;
    }
    
    netmask.s_addr = htonl((0xFFFFFFFF << (32 - prefixLength)));
 
    return (addr.s_addr & netmask.s_addr) == (network.s_addr & netmask.s_addr);
}
Функция выходит по ошибке вот в этом фрагменте:

C
1
2
3
4
5
6
7
 if (inet_pton(AF_INET, cidr, &network) <= 0) {
        // Некорректный CIDR-префикс
        fprintf(stderr, "Error converting CIDR prefix: %s\n", strerror(errno));
        perror("error converting network structure");
        printf("Некорректный CIDR-префикс\n");
        return 0;
    }
Результат фрагмента выше:

Code
1
2
3
4
5
ipAddress: 192.168.0.10
cidr: 192.168.0.0/24
Error converting CIDR prefix: No error: 0
error converting network structure: No error: 0
Некорректный CIDR-префикс
Пытался записать в структуру так: inet_pton(AF_INET, cidr, &network);
Потом пытался считать (уже не помню каким образом), при попытке считать из этого поля получал 0.0.0.0, следовательно в структуру нифига не записалось.
Проверял возвращаемое значение inet_pton, оно было 0. (неудачно)

Ошибка вылазит на этапе записи cidr в функции inet_pton.
Что-то не так с cidr префиксом, но не могу понять что.

В данном случае передаю значения следующим образом:
Code
1
isIPInCIDR("192.168.0.10", "192.168.0.0/24");
Замучался искать проблему.
Проверял переданную с троку на нечитаемые символы:
Code
1
2
3
4
5
6
7
8
9
10
11
void printUnreadableString(const char* str) {
    const unsigned char* p = (const unsigned char*)str;
    while (*p) {
        if (*p < 32 || *p > 126) {
            printf("\\x%02X", *p);
        } else {
            putchar(*p);
        }
        p++;
    }
}
Но ничего не обнаружил.

Не знаю где может быть проблема. памагите!

PS: код не мой и я не до конца понимаю что и куда я передаю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2023, 23:33
Ответы с готовыми решениями:

Как прописать запрет доступа к урл в nginx по маске?
Я хочу прописать запрет доступа в nginx файл к ссылкам вида uk/404.php?c=L3NoL2FwaS8_dHlwZT02JmlkPTg0NA,, Пишу location ~...

Разрешение доступа винформе
Как сделать так чтобы файл успешно скачивался по этому пути? &quot;C:\Users\Default.DESKTOP-MQBJ0K1\AppData\Roaming\NOXIS&quot;. Пишет что...

Поиск файлов по маске с игнорированием закрытых для доступа папок
Привет. Написал вот так, а оно доходит до папки system volume information и ошибка - Отказано в доступе по пути &quot;d:\System Volume...

6
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
08.06.2023, 11:35
Цитата Сообщение от simonC Посмотреть сообщение
cidr: 192.168.0.0/24
Цитата Сообщение от simonC Посмотреть сообщение
if (inet_pton(AF_INET, cidr, &network) <= 0) {
Почитай внимательно, что делает функция inet_pton и что ты в нее передаешь:
https://www.opennet.ru/man.sht... &russian=0
И ответь на вопрос при чем тут CIDR?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
08.06.2023, 15:38
Могу код только на питоне написать (как с использованием библиотек, так и без). Надо?
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
08.06.2023, 16:09  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Надо?
Нет, я просто питон с исходником на Си не скрещу
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
08.06.2023, 17:35
Фигня, что там байты, что тут байты.

Меня выбесил питон, потом во-о-от раст

Rust
1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
    let net: u32 = (192 << 24) + (168 << 16) + (0 << 8) + 0;
    let mask: u32 = (255 << 24) + (255 << 16) + (255 << 8) + 0;  // /24
 
    let net = net & mask;
    let min_ip = net + 1;
    let max_ip = &net | (!&mask) - 1;
    dbg!(&min_ip, &max_ip);
 
    let ip: u32 = (192 << 24) + (168 << 16) + (0 << 8) + 10;
    println!("{}", min_ip <= ip && ip <= max_ip);  // true
}
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
09.06.2023, 11:03  [ТС]
да меня вчера уже всё выбесило

Вот это на данном этапе работает:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int isIPAndMask(const char* ipAddress, const char* mask, const char* clientIP) {
    puts("start isIPAndMask\n");
    printf("ipAddress func_isIPAndMask %s\n",ipAddress);
    //int cidr=maskToCIDR(mask);
    printf("mask func_isIPAndMask is: %s\n",mask);
    printf("mask func_desiredCliIP is: %s\n",clientIP);
    
    struct in_addr addr;
    struct in_addr netmask;
    struct in_addr network;
    struct in_addr desiredNetworkAddress;
    
if (inet_pton(AF_INET, ipAddress, &addr) <= 0) {
        printf("Некорректный IP-адрес ipAddress %s\n", ipAddress);
        return 0;
    }
 
    if (inet_pton(AF_INET, mask, &netmask) <= 0) {
        fprintf(stderr, "Error converting CIDR prefix: %s\n", strerror(errno));
        perror("error converting network structure");
        printf("Некорректный CIDR-префикс\n");
        return 0;
    }
 
    network.s_addr = addr.s_addr & netmask.s_addr;
 
    if (inet_pton(AF_INET, clientIP, &desiredNetworkAddress) <= 0) {
        printf("Некорректный адрес желаемой подсети\n");
        return 0;
    }
 
if ((addr.s_addr & netmask.s_addr) == (desiredNetworkAddress.s_addr & netmask.s_addr)) {
    return 1;
} else {
    return 0;
}
 
}
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
09.06.2023, 16:36
Цитата Сообщение от simonC Посмотреть сообщение
if ((addr.s_addr & netmask.s_addr) == (desiredNetworkAddress.s_addr & netmask.s_addr))
Хм, да, так правильнее, чем сравнивать диапазоны.

Я бы сделал эти переменные глобальными:
C
1
2
struct in_addr g_network;
struct in_addr g_netmask;
И заполнял бы при старте приложения.

Тогда функция сократится до пары строк (не вижу смысла хранить IPv4 адреса в виде строки):

C
1
2
3
4
5
6
#include <stdbool.h>
 
bool acl(struct in_addr* client_ip)
{
    return (client_ip.s_addr & g_netmask.s_addr) == g_network.s_addr;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2023, 16:36
Помогаю со студенческими работами здесь

Разрешение для доступа к сети
Есть клиентское приложение, которое устанавливается на компьютеры пользователей без админского доступа (Windows 10). Развертывание по...

Проверка разрешение сетевого доступа
Подскажите как можно проверить что клиент отключил в настройках приложения доступ к сети?

Разрешение доступа к файлу по паролю
Есть файл панели администратора, который хочу защитить с помощью .htaccess (если есть ещё способы и более надежные, пишите). Содержание...

FreeRadius + CoovaChilli разрешение доступа
Всем привет. Народ, подскажите пожалуйста есть ли в FreeRadius`е атрибут для группы, чтобы был разрешен доступ только на один IP. Т.е....

Задача на наследование. Разрешение доступа
Здравствуйте, Задача: Клиент банка хочет взять кредит, он вводит запрашиваемую сумму, а банк должен разрешить или запретить транзакцию. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru