Skip to content
SilverPC Blog

SilverPC Blog

Tech

Dupla erő: Két internet szolgáltató egyesítése a megállíthatatlan online élményért!
  • Tech

Dupla erő: Két internet szolgáltató egyesítése a megállíthatatlan online élményért!

2025.09.04.
Sávszélesség elosztása profi módon: hogy a letöltő, a játékos és a filmnéző is boldog legyen!
  • Tech

Sávszélesség elosztása profi módon: hogy a letöltő, a játékos és a filmnéző is boldog legyen!

2025.09.04.
Hardverközeli programozás `Visual C++` alatt: Így férj hozzá az `FPR regiszterek` mind a 80 bitjéhez `x64`-en!
  • Tech

Hardverközeli programozás `Visual C++` alatt: Így férj hozzá az `FPR regiszterek` mind a 80 bitjéhez `x64`-en!

2025.09.04.
Támad a Linux, de a DVD meghajtó nem adja meg magát? Mutatjuk a megoldást!
  • Tech

Támad a Linux, de a DVD meghajtó nem adja meg magát? Mutatjuk a megoldást!

2025.09.04.
`BSC diploma` a fiókban vagy a falon? Tényleg érdemes befejezni, ha már van állásod?
  • Tech

`BSC diploma` a fiókban vagy a falon? Tényleg érdemes befejezni, ha már van állásod?

2025.09.04.
A zsebedben az asztalod: A PC elérése interneten keresztül PDA-ról – a távoli hozzáférés klasszikus módja
  • Tech

A zsebedben az asztalod: A PC elérése interneten keresztül PDA-ról – a távoli hozzáférés klasszikus módja

2025.09.04.

Express Posts List

Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!
  • Hardver

Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!

2025.09.04.
Képzeljük el a helyzetet: este van, kint süvít a szél, a házban csend honol. Sürgősen ki kell...
Bővebben Read more about Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!
Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!
  • Szoftver

Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!

2025.09.04.
Az előlapi USB sebessége csigává változott? Így turbózhatod fel újra!
  • Hardver

Az előlapi USB sebessége csigává változott? Így turbózhatod fel újra!

2025.09.04.
Sósav és nátrium-hidroxid találkozása: Ezt tapasztalod, ha univerzális indikátort használsz!
  • Egyéb

Sósav és nátrium-hidroxid találkozása: Ezt tapasztalod, ha univerzális indikátort használsz!

2025.09.04.
Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?
  • Szoftver

Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?

2025.09.04.
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.

  Windows 7-ről 10-re frissítés: Megéri a váltás?

👨‍💻 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.

  Bővítmény problémák: Gyakori hibák és megoldások

⚠️ 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

Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?
  • Szoftver

Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?

2025.09.04.
Szabadulnál tőle? Az Internet Explorer 8 (IE8) eltávolítása (remove) lépésről lépésre
  • Szoftver

Szabadulnál tőle? Az Internet Explorer 8 (IE8) eltávolítása (remove) lépésről lépésre

2025.09.04.
Bináris keresés turbó fokozaton: A `logaritmikus, intervallumfelezéses keresés` implementálása `C++`-ban
  • Szoftver

Bináris keresés turbó fokozaton: A `logaritmikus, intervallumfelezéses keresés` implementálása `C++`-ban

2025.09.04.
`C# adatbázis kezelés` egyszerűen: Készíts saját `nyilvántartás kezelő programot` lépésről lépésre!
  • Szoftver

`C# adatbázis kezelés` egyszerűen: Készíts saját `nyilvántartás kezelő programot` lépésről lépésre!

2025.09.04.
`Unity` részecskék, amik nem kelnek életre: Miért nem működik a `Particle System` `script` általi létrehozáskor?
  • Szoftver

`Unity` részecskék, amik nem kelnek életre: Miért nem működik a `Particle System` `script` általi létrehozáskor?

2025.09.04.
Az `md5()` `PHP függvény` sötét oldala: Miért ne használd jelszavakhoz, és mi a helyes megoldás?
  • Szoftver

Az `md5()` `PHP függvény` sötét oldala: Miért ne használd jelszavakhoz, és mi a helyes megoldás?

2025.09.04.

Olvastad már?

Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!
  • Hardver

Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!

2025.09.04.
Képzeljük el a helyzetet: este van, kint süvít a szél, a házban csend honol. Sürgősen ki kell...
Bővebben Read more about Rémisztő hangok a sötétből: a nyomtató kattog, kretyeg, de egy oldalt sem nyomtat? Ne ess pánikba!
Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!
  • Szoftver

Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!

2025.09.04.
Az előlapi USB sebessége csigává változott? Így turbózhatod fel újra!
  • Hardver

Az előlapi USB sebessége csigává változott? Így turbózhatod fel újra!

2025.09.04.
Sósav és nátrium-hidroxid találkozása: Ezt tapasztalod, ha univerzális indikátort használsz!
  • Egyéb

Sósav és nátrium-hidroxid találkozása: Ezt tapasztalod, ha univerzális indikátort használsz!

2025.09.04.
Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?
  • Szoftver

Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?

2025.09.04.

Ne maradj le

Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!
  • Szoftver

Multitasking a parancssorban: Így hozz létre és kezelj több `screent` az `Ubuntu 15.10-es terminálban`!

2025.09.04.
Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?
  • Szoftver

Végzetes hiba egyetlen karakteren: Miért rossz ez a `C++ kód` és mi az a hiba, amit minden kezdő elkövet?

2025.09.04.
Elsőfokú kétismeretlenes egyenlet: A megoldás kulcsa, egyszerűbben, mint gondolnád
  • Tudomány

Elsőfokú kétismeretlenes egyenlet: A megoldás kulcsa, egyszerűbben, mint gondolnád

2025.09.04.
Készíts lenyűgöző természettudományi jelenséget bemutató modellt: Zseniális ötletek a versenyre!
  • Tudomány

Készíts lenyűgöző természettudományi jelenséget bemutató modellt: Zseniális ötletek a versenyre!

2025.09.04.
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.