Whitelist IP pentru GM/Admini [C++]

Aici poți găsi sisteme complete, verificate și recomandate de echipa 4Metin.
Avatar utilizator
Loud
Tehnic
Tehnic
Mesaje: 263
Membru din: Mar Oct 18, 2022 12:48 pm
Localitate: Underwater
Status: Activ
Multumiri acordate: 2
Multumiri primite: 53
Contact:

Whitelist IP pentru GM/Admini [C++]

Mesaj de Loud »

Implementarea unui sistem de whitelist IP pentru conturile GM/Admin in serverul tau va permite conectarea acestora doar de pe adrese IP aprobate, prevenind accesul neautorizat la conturile administrative. Acest sistem a fost creat integral de catre mine! Nici o parte de cod nu a fost copiata de undeva.
Pentru probleme si intrebari va rog sa imi scrieti aici printr`un replay sau pe discord in PM sau direct pe serverul comunitatii!

---

# 1. Cum functioneaza sistemul de whitelist IP?
1. Se creeaza o lista cu IP-urile autorizate pentru fiecare cont de GM/Admin.
2. La autentificare, serverul verifica IP-ul jucatorului.
3. Daca IP-ul nu se regaseste in whitelist, conexiunea este respinsa.



# 2. Pasi pentru implementare

## Pasul 1: Definirea whitelist-ului in baza de date

1. Creeaza o noua tabela in baza de date `account` pentru whitelist-ul de IP:


```

Cod: Selectaţi tot

sql
   CREATE TABLE account_ip_whitelist (
       account_id INT NOT NULL,
       ip_address VARCHAR(45) NOT NULL,
       PRIMARY KEY (account_id, ip_address),
       FOREIGN KEY (account_id) REFERENCES account(id) ON DELETE CASCADE
   );
```

2. Adauga IP-urile autorizate pentru conturile administrative:

```sql

Cod: Selectaţi tot

   INSERT INTO account_ip_whitelist (account_id, ip_address) VALUES
   (1, '192.168.1.100'),
   (2, '203.0.113.45');
```

---

## Pasul 2: Modificarea autentificarii pe server (C++)

1. Deschide fisierul sursa `input_db.cpp` si gaseste functia care gestioneaza login-ul:


```

Cod: Selectaţi tot

cpp
   bool CInputDB::Login(LPCHARACTER ch, const char* c_pszLogin, const char* c_pszPwd)
```

2. Adauga cod pentru verificarea IP-ului:

Cod: Selectaţi tot

   ```cpp
   std::string query = fmt::format("SELECT COUNT(*) FROM account_ip_whitelist WHERE account_id='{}' AND ip_address='{}'",
                                   ch->GetAccountID(), ch->GetDesc()->GetHostName());

   std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(query.c_str()));
   if (msg->Get()->uiNumRows == 0)
   {
       sys_log(0, "Login respins: IP-ul {} nu este autorizat pentru contul {}", ch->GetDesc()->GetHostName(), ch->GetName());
       ch->ChatPacket(CHAT_TYPE_INFO, "[SECURITY] Acces interzis!");
       return false;
   }
   ```
3. Salveaza modificarile si compileaza serverul.

---

## Pasul 3: Adaugarea suportului in config-ul serverului

1. In fisierul de configurare `config`, adauga optiunea pentru activarea whitelist-ului:

Cod: Selectaţi tot

   ```ini
   ENABLE_IP_WHITELIST = 1
   ```
2. In codul sursa, citeste configuratia:

Cod: Selectaţi tot

   ```cpp
   bool g_bEnableIPWhitelist = false;
   ConfigReadBool("ENABLE_IP_WHITELIST", &g_bEnableIPWhitelist);
   ```
3. Aplica restrictia doar daca whitelist-ul este activ:

Cod: Selectaţi tot

   ```cpp
   if (g_bEnableIPWhitelist)
   {
       // Executa verificarea IP-ului
   }
   ```
---

# 3. Testarea sistemului
1. Porneste serverul si incearca sa te conectezi de pe un IP neautorizat.
2. Verifica logurile pentru mesajele de securitate.
3. Adauga un IP nou in baza de date si confirma ca se poate conecta corect.

---

# 4. Avantaje si limitari

**Avantaje:**
- Previne accesul neautorizat la conturile administrative.
- Se poate actualiza lista de IP-uri din baza de date fara a reporni serverul.
- Usor de implementat si configurat.

**Limitari:**
- GM/Adminii cu IP-uri dinamice pot avea dificultati in conectare.
- Daca baza de date nu este disponibila, login-ul poate fi afectat.
Scrie răspuns