• В каком поле заголовка TCP/IP можно передать информацию и как её закодировать?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Посмотрите на TOS
    https://tools.ietf.org/html/rfc791

    Немного дополню, посмотрите на вот эту концепцию https://zeltser.com/c2-dns-tunneling/
    Все тоже самое, только с заголовками TOS.
    Конечно это будет жутко тормозить и возможно где то срежется маршрутизаторами.
    Другой вариант это подняться до прикладного уровня, но как я понимаю это не ваш путь.

    Совсем отмороженный вариант это своеобразная морзянка. То есть модифицируете пакет что бы у него было 2 каких либо различия. И работаете по протоколу:

    ........ - 0x00
    .......- - 0x01
    ......-. - 0x03
    ......-- - 0x04
    Ответ написан
    2 комментария
  • Как правильно реализовать авторизацию и аутентификацию на сайте?

    @ghostiam
    На Go писатель, серверов пинатель.
    Да, самый простой вариант, это:
    Пользователь отправляет нам на сервер логин+пароль.
    Сервер сверяет с данными в БД, если всё хорошо, то генерирует большую случайную строку(Токен), которую добавляет как запись в БД (UserID, Token), после этого отправляет клиенту токен, чтоб тот установил у себя его в куки (заголовок Set-Cookie).
    Теперь браузер клиента на каждый запрос будет отсылать на сервер куку и мы можем, обращаясь к БД на поиск строки из куки, получать данные о пользователе.
    Но так как хранение в БД не всегда эффективно, токены хранят иногда в быстрых БД, таких как Redis или MemCached.

    По поводу сессии:
    Иногда, чтоб не ходить в главную БД на каждый запрос, некоторые данные выносят из главной БД(В тот же Redis, MemCached или даже просто в файл на диске с именем токена). Просто теперь, хранится не только токен, но и по имени токена сразу же получают некоторые данные, например, что у пользователя ID=42 и что он администратор.

    Через какое то время удалять?

    День, неделя, несколько часов, зависит от задачи.
    Например, некоторые сайты хранят сессию сутки, но если нажать галочку "Запомнить меня", то срок может увеличится до недели или месяца.
    Сервисы оперирующие с деньгами или чем-то, что может представлять ценность, делают сессии от 10 минут.
    Ответ написан
    6 комментариев
  • Как правильно упаковать json, чтобы передать клавиатуру?

    Лучше всего создать типа под Inline keyboard и маршалить из него
    type InlineKeyboard [][]InlineKeyboardButton
    
    type InlineKeyboardButton struct {
    	Text         string
    	Url          string
    	CallbackData interface{}
    }
    Ответ написан
    1 комментарий
  • Почему не выполняется работа горутин?

    @deliro
    Ты в wg добавляешь единицу, первая выполнившаяся горутина эту единицу отнимает, wg.Wait() разблокирует поток и main завершается. wg.Add нужно делать на каждую горутину, которую ты хочешь подождать

    Также os.Exit завершает весь процесс. То есть, первая горутина, которая на него наткнётся, завершит всё

    Ещё ты абсолютно бесконтрольно спавнишь горутины в бесконечном цикле. Используй адекватное количество горутин, которые работают одновременно и закидывай им таски через каналы

    Почитай теорию ещё пару раз

    А вот ещё прекрасная статья, которая поможет понять горутины и типичные примеры их использования
    Ответ написан
    1 комментарий
  • Iptables правила для captive portal?

    mikes
    @mikes
    создать цепочку и кидать всех туда
    если в одном L2 сегменте, то от мака пользователя DST NAT в адрес captive portal, после успешной авторизации мак пользователя вычеркнуть из цепочки
    Ответ написан
    Комментировать
  • Iptables правила для captive portal?

    iptables:
    *nat
    -A PREROUTING -d 10.100.0.220/32 -p tcp -m tcp --dport 80 -j ACCEPT
    -A PREROUTING -p tcp -m tcp --dport 80 -m set ! --match-set mac-allowed src -j DNAT --to-destination 10.100.0.220
    
    *filter
    -A FORWARD -i vlan1+ -j macallowed
    -A macallowed -d DNS-сервер -p udp -m udp --dport 53 -j ACCEPT
    -A macallowed -m set --match-set mac-allowed src -j ACCEPT
    -A macallowed -j DROP


    ipset:
    create mac-allowed hash:mac hashsize 1024 maxelem 65536
    add mac-allowed A0:4E:A7:55:44:33


    Примерно так.
    В nat prerouting трафик не из ipset разрешенных MAC-адресов заворачивается на хост с порталом.
    И на портале надо в заголовке указать код 511, чтобы captive portal detection понимал, что это песочница и сам
    открывал окно для дополнительных действий для подключения( хотя это не точно):
    header('HTTP/1.1 511 Network Authentication Required', TRUE, 511);
    header("Location: http://10.100.0.220/portal/index.php?step=1");


    PS. Можно обойтись и без ipset, но с ним быстрее, когда записей станет много.
    Ответ написан
    Комментировать
  • В каком направление осуществить реализацию НН?

    Therapyx
    @Therapyx
    Data Science
    машинное обучение это не панацея. Думай какие проекты можно реализовать, в которых можно рационально применить вставки машинного обучения, а не наоборот.
    Ну и кто знает твои нужды? )) На этот вопрос тебе нигде и никто не ответит.
    Ответ написан
    Комментировать
  • Почему элемент вектора не присваивается переменной?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Наверное, ошибка в том, что не "который встречается в нём N/2 раз", а "как минимум N/2 раз, где N - количество уникальных элементов"? Т.е. у вас ошибка в строгом сравнении.
    if((vec.size()-1)/2.0 == mycount ) // <<------

    Вариант с std::map<char, int>
    #include <iostream>
    #include <fstream>
    #include <map>
    
    using namespace std;
    
    int main(int argc, char* argv[]) {
        ifstream input("base.txt");    
        map<char, int> charFrequencyMap;
    
        cout << "Source vector: ";
        while( !input.eof() ) {
            char sym;
            input >> sym;
            cout << sym << " | ";
            charFrequencyMap[sym]++;
        }
        input.close();
        cout << endl;
    
        int charsCount = charFrequencyMap.size();
    
        cout << "Leading elements: ";
        for (pair<char, int> item : charFrequencyMap) {
            bool isLeading = item.second >= charsCount / 2.;
            if ( isLeading ) {
                cout << item.first << " | ";
            }
        }
        cout << endl;
    
        return 0;
    }
    Ответ написан
    5 комментариев
  • Системные вызовы в Linux?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Не совсем понятно, в чем у вас возникает проблема. К примеру link, который вам нужен - из мана мы видим, что нужно подключить
    #include <unistd.h>
    и вызвать функцию link, с двумя параметрами - строками - именем существующего файла (пусть будет test.txt) и новым именем файла для ссылки, выглядит примерно так:
    link("test.txt", "newlinktotest.txt");
    Ответ написан
    6 комментариев