Skip to content
SilverPC Blog

SilverPC Blog

Tech

A macskagyökér tea mint a digitális detox tökéletes itala
  • Tech

A macskagyökér tea mint a digitális detox tökéletes itala

2025.09.07.
Elveszett driver a Panasonic NV-GS50 kamerádhoz? Segítünk megtalálni a működő Windows 7 telepítőt!
  • Tech

Elveszett driver a Panasonic NV-GS50 kamerádhoz? Segítünk megtalálni a működő Windows 7 telepítőt!

2025.09.07.
Digitális nagytakarítás: Így törölheted véglegesen a régi, elfeledett Facebook fiókodat!
  • Tech

Digitális nagytakarítás: Így törölheted véglegesen a régi, elfeledett Facebook fiókodat!

2025.09.07.
Hogyan küldj üzenetet a Microsoftnak, ha a hivatalos Freemail csatornák csődöt mondanak?
  • Tech

Hogyan küldj üzenetet a Microsoftnak, ha a hivatalos Freemail csatornák csődöt mondanak?

2025.09.07.
Végleges búcsú: Lépésről-lépésre útmutató, hogyan törölhetsz egy régi fiókot a Facebookon!
  • Tech

Végleges búcsú: Lépésről-lépésre útmutató, hogyan törölhetsz egy régi fiókot a Facebookon!

2025.09.07.
Elérhetetlen a Microsoft? Így küldhetsz nekik üzenetet akár Freemailről is, ha a hivatalos cím nem működik!
  • Tech

Elérhetetlen a Microsoft? Így küldhetsz nekik üzenetet akár Freemailről is, ha a hivatalos cím nem működik!

2025.09.07.

Express Posts List

Terhesség és szoptatás alatt iható az orbáncfű tea
  • Tudomány

Terhesség és szoptatás alatt iható az orbáncfű tea

2025.09.07.
Az anyaság csodálatos, de egyben kihívásokkal teli utazás, amely során a kismamák és újdonsült édesanyák fokozottan odafigyelnek...
Bővebben Read more about Terhesség és szoptatás alatt iható az orbáncfű tea
Az orbáncfű gyűjtése és szárítása otthon a legjobb teáért
  • Kert

Az orbáncfű gyűjtése és szárítása otthon a legjobb teáért

2025.09.07.
Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban
  • Tudomány

Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban

2025.09.07.
Primary Menu
  • Főoldal
  • Hírek
  • Tech
  • Hardver
  • Szoftver
  • Mobil
  • Gamer
  • Játék
  • Web
  • Tudomány
  • Egyéb
  • Szoftver

Visszaszámlálás indul: Így adj időzárat egy konzolos C++ login felülethez!

2025.09.04.

Egy login felület megvalósítása, még egy egyszerű, konzolos C++ alkalmazásban is, sokkal többet jelent, mint csupán egy felhasználónév és jelszó ellenőrzése. A biztonság sosem opció, hanem alapvető szükséglet, különösen ott, ahol érzékeny adatok védelméről van szó. Különösen igaz ez a brute-force támadások korában, ahol automatizált rendszerek próbálják ki a lehetséges jelszókombinációkat percek alatt. Hogyan védhetjük meg konzolos loginunkat az ilyen jellegű próbálkozások ellen? A válasz az időzáras védelem, vagy ahogy a szakma ismeri, az „attempt lockout” mechanizmus.

Képzeljük el a helyzetet: van egy parancssori alkalmazásunk, ami valamilyen adminisztratív felületet nyújt, vagy kritikus erőforrásokhoz ad hozzáférést. Az elsődleges védelmi vonal egy jelszó, de mi történik, ha valaki elkezd találgatni? Egy idő után, ha nincsenek korlátok, előbb-utóbb rátalálhat a helyes kombinációra. Pontosan ez ellen nyújt hatékony pajzsot az időzár.

🔒 A Brute-Force Fenyegetés és Miért Lényeges az Időzár?

A brute-force, vagy nyers erő alapú támadás egy klasszikus, mégis rendkívül hatékony módszer a jelszavak feltörésére. Lényege, hogy a támadó szisztematikusan próbálja ki az összes lehetséges jelszókombinációt, egészen addig, amíg rá nem bukkan a helyesre. Mivel ez emberi léptékben lassú és unalmas feladat lenne, ma már ezt szoftverek végzik, hihetetlen sebességgel. Ezer, tízezer, akár millió próbálkozás másodpercenként sem ritka modern hardverekkel és optimalizált algoritmusokkal.

Egy egyszerű C++ login felület, amely csak a jelszó helyességét ellenőrzi, teljesen védtelen ezen támadásokkal szemben. Ha a támadó rendelkezik elég idővel és számítási kapacitással, csak idő kérdése, hogy feltörje a védelmet. Itt jön képbe az időzáras rendszer. Ennek célja, hogy korlátozza a sikertelen belépési kísérletek számát egy adott időintervallumon belül, majd egy bizonyos számú hibás próbálkozás után ideiglenesen blokkolja a hozzáférést. ⏰

„A biztonság nem egy termék, hanem egy folyamat.” – Bruce Schneier. Ez a gondolat tökéletesen illik az időzárakra is. Nem egy egyszeri beállítás, hanem egy folyamatos védelmi mechanizmus, ami aktívan részt vesz a rendszer integritásának fenntartásában.

🧭 Az Időzár Tervezése: Alapok és Elmélet

Mielőtt belevetnénk magunkat a kódolásba, érdemes átgondolni néhány alapelvet és a rendszer működését. Milyen adatokra lesz szükségünk? Hogyan tároljuk ezeket? Milyen logikát követünk?

Szükséges adatok:

  • Sikertelen próbálkozások száma (fail count): Hány alkalommal tévedett a felhasználó a jelszóval.
  • Utolsó sikertelen próbálkozás időpontja (last attempt timestamp): Mikor volt az utolsó hibás bejelentkezés. Ezt használjuk majd a zárolás időtartamának számításához.
  • Zárolási küszöb (lockout threshold): Hány hibás kísérlet után lép életbe a zárolás (pl. 3, 5).
  • Zárolás időtartama (lockout duration): Mennyi ideig marad blokkolva a hozzáférés a küszöb átlépése után (pl. 30 másodperc, 5 perc).

Adatok tárolása:

Konzolos alkalmazásunk szempontjából két fő megközelítés létezik:

  1. Memóriában (in-memory): A program futása alatt tároljuk az adatokat. Egyszerű, gyors, de a program újraindításakor elvesznek az információk. Alkalmas kisebb, gyors tesztekre, vagy ha a program élettartama rövid és nem kritikus a perzisztencia.
  2. Perzisztens tárolás (persistent storage): Fájlba írjuk az adatokat (pl. JSON, egyszerű szövegfájl). Ez biztosítja, hogy a program újraindításakor is megmaradjon az időzár állapota. Ez a professzionálisabb és biztonságosabb megközelítés.

Ebben a cikkben mindkét megközelítést érintjük, de a hangsúly a perzisztens megoldáson lesz.

  Kriptovaluta-felhasználók biztonsága: új fenyegetések árnyékában

👨‍💻 Implementáció C++-ban: Lépésről Lépésre

A modern C++ kiváló eszközöket biztosít az időkezeléshez a <chrono> könyvtár révén. Ez lesz a legfőbb segítőnk az időzáras mechanizmus kialakításában.

1. Szükséges Könyvtárak


#include <iostream>     // Be-/kimenet
#include <string>       // Szövegkezelés
#include <chrono>       // Időkezelés (nagyon fontos!)
#include <thread>       // std::this_thread::sleep_for
#include <fstream>      // Fájlkezelés a perzisztenciához
#include <map>          // A felhasználói adatok tárolására
#include <sstream>      // String manipuláció

2. Adatszerkezet a Próbálkozásokhoz

Definiáljunk egy struktúrát, ami tárolja az egyes felhasználók belépési kísérleteinek adatait:


struct LoginAttemptData {
    int failedAttempts = 0;
    std::chrono::system_clock::time_point lastAttemptTime;

    LoginAttemptData() : lastAttemptTime(std::chrono::system_clock::time_point::min()) {}
};

// Egy térkép a felhasználónevek és a hozzájuk tartozó adatok tárolására
std::map<std::string, LoginAttemptData> userAttemptData;

3. Időkezelés a `std::chrono` Segítségével

A std::chrono egy erőteljes és flexibilis eszköz az idővel való munkához. Használni fogjuk a system_clock-ot az aktuális időpont lekérdezéséhez, és a duration típusokat az időtartamok számításához.


// Példa: mennyi idő telt el az utolsó próbálkozás óta
auto now = std::chrono::system_clock::now();
auto timeSinceLastAttempt = now - userAttemptData["felhasznalo"].lastAttemptTime;

// Példa: várakozási idő 30 másodperc
std::chrono::seconds lockoutDuration(30);

4. Perzisztens Adatkezelés Fájlból

Ahhoz, hogy a zárolási állapot megmaradjon a program újraindítása után is, szükségünk van egy fájlra. Egy egyszerű formátumot használhatunk, például: username:failed_attempts:timestamp_in_seconds.


const std::string ATTEMPT_FILE = "login_attempts.txt";

void loadLoginAttempts() {
    std::ifstream file(ATTEMPT_FILE);
    std::string line;
    if (file.is_open()) {
        while (std::getline(file, line)) {
            std::stringstream ss(line);
            std::string username_str, attempts_str, time_str;
            std::getline(ss, username_str, ':');
            std::getline(ss, attempts_str, ':');
            std::getline(ss, time_str, ':');

            try {
                int attempts = std::stoi(attempts_str);
                long long time_ll = std::stoll(time_str);
                
                LoginAttemptData data;
                data.failedAttempts = attempts;
                data.lastAttemptTime = std::chrono::system_clock::time_point(std::chrono::seconds(time_ll));
                userAttemptData[username_str] = data;
            } catch (const std::exception& e) {
                std::cerr << "⚠️ Hiba a próbálkozási adatok betöltésekor: " << e.what() << std::endl;
            }
        }
        file.close();
    }
}

void saveLoginAttempts() {
    std::ofstream file(ATTEMPT_FILE);
    if (file.is_open()) {
        for (const auto& pair : userAttemptData) {
            file << pair.first << ":"
                 << pair.second.failedAttempts << ":"
                 << std::chrono::duration_cast<std::chrono::seconds>(pair.second.lastAttemptTime.time_since_epoch()).count()
                 << std::endl;
        }
        file.close();
    } else {
        std::cerr << "⚠️ Hiba a próbálkozási adatok mentésekor." << std::endl;
    }
}

5. A Login Funkció Vázlata Időzárral

Most építsük be a logikát a bejelentkezési folyamatba. Ehhez egy egyszerű, fix felhasználónév/jelszó párost használunk. A valós rendszerek természetesen adatbázist és hash-elt jelszavakat alkalmaznának, de a példához ez elegendő.


bool login(const std::string& username, const std::string& password) {
    const int MAX_FAILED_ATTEMPTS = 3;
    const std::chrono::seconds LOCKOUT_DURATION(30); // 30 másodperc zárolás

    // Frissítjük a próbálkozási adatokat az adott felhasználóra
    LoginAttemptData& data = userAttemptData[username]; // Ha nincs ilyen felhasználó, létrehozza alapértékekkel

    auto now = std::chrono::system_clock::now();

    // Ellenőrizzük, hogy aktív-e a zárolás
    if (data.failedAttempts >= MAX_FAILED_ATTEMPTS) {
        auto timeSinceLastAttempt = now - data.lastAttemptTime;
        if (timeSinceLastAttempt < LOCKOUT_DURATION) {
            auto remainingTime = LOCKOUT_DURATION - timeSinceLastAttempt;
            std::cout << "⛔ Hozzáférés ideiglenesen blokkolva ehhez a felhasználóhoz. Kérjük, várjon "
                      << std::chrono::duration_cast<std::chrono::seconds>(remainingTime).count()
                      << " másodpercet." << std::endl;
            return false;
        } else {
            // A zárolás ideje lejárt, alaphelyzetbe állítjuk a számlálót
            data.failedAttempts = 0;
            data.lastAttemptTime = std::chrono::system_clock::time_point::min(); // alaphelyzetbe állítás
        }
    }

    // A tényleges jelszó ellenőrzés
    if (username == "admin" && password == "jelszo123") { // Ez egy fix példa
        std::cout << "✅ Sikeres bejelentkezés!" << std::endl;
        data.failedAttempts = 0; // Sikeres login után nullázunk
        data.lastAttemptTime = std::chrono::system_clock::time_point::min();
        saveLoginAttempts(); // Mentsük a változásokat
        return true;
    } else {
        std::cout << "❌ Hibás felhasználónév vagy jelszó." << std::endl;
        data.failedAttempts++;
        data.lastAttemptData = now; // Frissítjük az utolsó próbálkozás idejét
        saveLoginAttempts(); // Mentsük a változásokat
        return false;
    }
}

int main() {
    loadLoginAttempts(); // Betöltjük a korábbi próbálkozásokat
    std::string username, password;

    while (true) {
        std::cout << "nKérjük, adja meg a felhasználónevet: ";
        std::cin >> username;
        std::cout << "Kérjük, adja meg a jelszót: ";
        std::cin >> password;

        if (login(username, password)) {
            break; // Kilépünk a ciklusból sikeres login után
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Kis késleltetés a további próbálkozások között
    }

    std::cout << "Üdvözöljük a rendszerben, " << username << "!" << std::endl;
    // Itt folytatódhat a program logikája
    return 0;
}

A fenti kódrészlet bemutatja, hogyan lehet integrálni az időzár mechanizmust egy konzolos C++ bejelentkezési felületbe. A main függvény hívja meg a loadLoginAttempts() függvényt a program indításakor, ami betölti a korábbi, sikertelen próbálkozások adatait. A login() függvény ellenőrzi a zárolási állapotot, frissíti a próbálkozások számát és az időbélyeget, majd elmenti ezeket az információkat a saveLoginAttempts() segítségével.

  Saját birodalom a neten: Milyen webszervert futtassak otthoni gépen a legjobb teljesítményért?

⚠️ Gyakori Hibák és Tippek a Megvalósításhoz

  • Jelszó hash-elése: A fenti példa kedvéért a jelszó egyszerű stringként van tárolva. Valós alkalmazásokban SOHA ne tároljunk jelszót egyszerű szövegként! Mindig használjunk biztonságos hash funkciókat, mint például SHA-256 vagy Argon2, és sózzuk (salt) a hash-t. Ez a biztonság alapja.
  • Időzónák: Konzolos alkalmazásoknál kevésbé kritikus, de nagyobb rendszereknél érdemes GMT/UTC időben tárolni az időbélyegeket, hogy elkerüljük az időzóna-eltérésekből adódó problémákat.
  • Felhasználói élmény: Mindig adjunk egyértelmű visszajelzést a felhasználóknak. A „Maradt X másodperc” üzenet segít megérteni, miért nem tudnak bejelentkezni, és elkerüli a frusztrációt.
  • Tesztek: Alaposan teszteljük a rendszert! Próbáljunk ki több sikertelen bejelentkezést, figyeljük a zárolás idejét, és ellenőrizzük, hogy a program újraindítása után is helyesen működik-e a védelem.
  • Globális zárolás: Megfontolható, hogy ne csak felhasználó-specifikusan, hanem például IP-cím alapján is történjen a zárolás, ha az adott platform engedi (konzol esetében ez nehezebben kivitelezhető).

💡 A Jövő és További Fejlesztési Lehetőségek

Ez az egyszerű időzáras védelem csak a kezdet. A rendszer továbbfejleszthető a következő módokon:

  • Dinamikus zárolási idő: A zárolás időtartama növelhető a sikertelen próbálkozások számával együtt (pl. 3 hibás után 30 mp, 6 hibás után 5 perc, 9 hibás után 1 óra). Ez még hatékonyabb védelmet nyújt.
  • E-mail értesítés: Rendkívül nagy számú sikertelen próbálkozás esetén a rendszer e-mailt küldhetne az adminisztrátornak, jelezve egy potenciális támadást.
  • Captchák: Bár konzolon nehézkes, grafikus felületen a Captcha-k beépítése szintén erősíti a védelmet az automatizált támadások ellen.
  • Naplózás: Minden bejelentkezési kísérletet (sikeres és sikertelen egyaránt) naplózni kellene egy biztonságos log fájlba, időbélyeggel és IP-címmel (ha lehetséges), hogy utólagos elemzésre is sor kerülhessen.

✅ Konklúzió: Biztonságosabb Login, Kevesebb Fejfájás

Láthatjuk, hogy egy konzolos C++ login felület sem maradhat védtelen a modern fenyegetésekkel szemben. Az időzáras mechanizmus beépítése nem egy óriási feladat, de rendkívül sokat tehet a rendszer biztonsága érdekében. A std::chrono segítségével elegánsan és hatékonyan kezelhetjük az időt, a perzisztens tárolás pedig gondoskodik róla, hogy a védelem a program újraindítását követően is érvényben maradjon.

Ezzel a viszonylag egyszerű kiegészítéssel jelentősen megnehezítjük a brute-force támadók dolgát, és sokkal robusztusabbá tesszük az alkalmazásunkat. Ne feledjük, a biztonság folyamatos odafigyelést és fejlesztést igényel. Kezdjük a legfontosabb lépésekkel, mint például egy jól megtervezett attempt lockout, és építsük erre a szilárd alapra a további védelmi rétegeket!

attempt lockout biztonság brute-force támadás C++ időzáras védelem jelszóvédelem konzolos alkalmazás login felület perzisztencia std::chrono
Megosztás Facebookon Megosztás X-en Megosztás Messengeren Megosztás WhatsApp-on Megosztás Viberen

Vélemény, hozzászólás? Válasz megszakítása

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Kapcsolódnak

„A fájl widget nem írható”: Hogyan hárítsd el a MonoDevelop Gtk# 2.0 projekt indítási hibáját?
  • Szoftver

„A fájl widget nem írható”: Hogyan hárítsd el a MonoDevelop Gtk# 2.0 projekt indítási hibáját?

2025.09.07.
Weboldal az alkalmazásodban: Így jelenítsd meg bármely honlapot az Android appodon belül!
  • Szoftver

Weboldal az alkalmazásodban: Így jelenítsd meg bármely honlapot az Android appodon belül!

2025.09.07.
Python kódod C++ nyelven szólalna meg? A Raspberry Pi kód átírásának lehetőségei és buktatói
  • Szoftver

Python kódod C++ nyelven szólalna meg? A Raspberry Pi kód átírásának lehetőségei és buktatói

2025.09.06.
A Java rejtélye: Milyen alapértelmezett értéket kap egy változó, ha elfelejted beállítani?
  • Szoftver

A Java rejtélye: Milyen alapértelmezett értéket kap egy változó, ha elfelejted beállítani?

2025.09.06.
C++ Kihívás: Így listázd ki az 55 összes többszörösét 1000-ig egy elegáns programmal!
  • Szoftver

C++ Kihívás: Így listázd ki az 55 összes többszörösét 1000-ig egy elegáns programmal!

2025.09.06.
Lefordul, de nem fut? A Code::Blocks rejtélyes üres ablaka és a megoldás
  • Szoftver

Lefordul, de nem fut? A Code::Blocks rejtélyes üres ablaka és a megoldás

2025.09.06.

Olvastad már?

Terhesség és szoptatás alatt iható az orbáncfű tea
  • Tudomány

Terhesség és szoptatás alatt iható az orbáncfű tea

2025.09.07.
Az anyaság csodálatos, de egyben kihívásokkal teli utazás, amely során a kismamák és újdonsült édesanyák fokozottan odafigyelnek...
Bővebben Read more about Terhesség és szoptatás alatt iható az orbáncfű tea
Az orbáncfű gyűjtése és szárítása otthon a legjobb teáért
  • Kert

Az orbáncfű gyűjtése és szárítása otthon a legjobb teáért

2025.09.07.
Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban
  • Tudomány

Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban

2025.09.07.

Ne maradj le

Terhesség és szoptatás alatt iható az orbáncfű tea
  • Tudomány

Terhesség és szoptatás alatt iható az orbáncfű tea

2025.09.07.
Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban
  • Tudomány

Orbáncfű tea a vizsgaidőszakban: tényleg segít a koncentrációban

2025.09.07.
Miért nem hat neked az orbáncfű tea? Lehetséges okok
  • Tudomány

Miért nem hat neked az orbáncfű tea? Lehetséges okok

2025.09.07.
A szezonális affektív zavar (SAD) kezelése orbáncfű teával
  • Tudomány

A szezonális affektív zavar (SAD) kezelése orbáncfű teával

2025.09.07.
Copyright © 2025 SilverPC Blog | SilverPC kérdések

Az oldalon megjelenő minden cikk, kép és egyéb tartalom a SilverPC.hu tulajdonát képezi, felhasználásuk kizárólag az eredeti forrás pontos és jól látható feltüntetésével engedélyezett.