Lecteur Markdown
CURRENT_USERS_DOCUMENTATION
Current Users #
Monitoring et modération des adresses IP visitant le site.
Version: 3.0.1
Niveau requis: `CURRENT_USERS_LEVEL_MODERATOR`
Depuis: 2002
Vue d'ensemble #
Plugin d'administration permettant de visualiser les IPs actives, consulter l'historique de navigation par IP, identifier les utilisateurs par adresse IP, et bannir les IPs indésirables. Inclut résolution DNS avec cache et auto-refresh toutes les 15 secondes.
Fonctionnalités #
- Liste des IPs récentes avec résolution hostname
- Vue détaillée par IP (utilisateurs, requêtes, IPs revendiquées)
- Bannissement d'IP avec traçabilité modérateur
- Cache DNS pour optimiser les résolutions
- Auto-refresh toutes les 15 secondes
- Détection multi-comptes (plusieurs users sur une IP)
Structure des tables #
current_user #
Table de tracking des visiteurs actifs.
CREATE TABLE current_user (
ip VARCHAR(45),
request VARCHAR(255),
timestamp DATETIME,
claimed_ips TEXT,
INDEX (ip),
INDEX (timestamp)
);
| Colonne | Type | Description |
|---------|------|-------------|
| `ip` | VARCHAR(45) | Adresse IP du visiteur (IPv4 ou IPv6) |
| `request` | VARCHAR(255) | URL complète de la requête |
| `timestamp` | DATETIME | Date/heure de la requête |
| `claimed_ips` | TEXT | IPs revendiquées par l'utilisateur (proxies, VPN) |
banned_ips #
Table des bannissements (optionnelle).
CREATE TABLE banned_ips (
offender VARCHAR(45) PRIMARY KEY,
motive VARCHAR(255),
tstamp DATETIME
);
| Colonne | Type | Description |
|---------|------|-------------|
| `offender` | VARCHAR(45) | IP bannie |
| `motive` | VARCHAR(255) | Raison du ban (format: `(username_moderateur)`) |
| `tstamp` | DATETIME | Date du bannissement |
Modes d'affichage #
1. Liste principale (défaut) #
URL : `?obj=current_users.php`
Affiche un tableau de toutes les IPs récentes avec résolution DNS :
┌─────────────────┬──────────────────────────────┐
│ IP Address │ Hostname │
├─────────────────┼──────────────────────────────┤
│ 192.168.1.42 │ client-42.isp.example.com │
│ 10.0.0.15 │ Anonymous │
└─────────────────┴──────────────────────────────┘
Pagination : `?obj=current_users.php&limit=200` (défaut: 80)
Auto-refresh : Page se recharge automatiquement toutes les 15 secondes.
---
2. Vue détaillée IP #
URL : `?obj=current_users.php&detail=192.168.1.42`
Affiche pour une IP donnée :
1. Utilisateurs associés
- Si 0 utilisateur → "Anonymous" + lien de ban
- Si 1 utilisateur → Lien vers profil
- Si 2+ utilisateurs → Liste complète (détection multi-comptes)
2. IPs revendiquées (claimed_ips)
- Liste des IPs alternatives déclarées par l'utilisateur
- Utile pour détecter proxies/VPN
3. Historique de navigation
- Tableau complet des requêtes effectuées
- Ordre anti-chronologique
- URLs cliquables
---
3. Action de bannissement #
URL : `?obj=current_users.php&ban=192.168.1.42`
Conditions :
- Table `banned_ips` doit exister
- IP pas déjà bannie
- Utilisateur modérateur authentifié
Comportement :
1. Validation IP via `Parser::sanitize()`
2. Vérification anti-doublon `isBanned()`
3. Récupération username modérateur depuis session
4. Insert dans `banned_ips` avec `motive = "(username)"`
5. Affichage message confirmation
6. Refresh interface
Fonctions #
gethost #
Résolution DNS avec cache en mémoire.
function gethost(string $i): string
Paramètres :
- `$i` — Adresse IP à résoudre
Retourne : Hostname ou IP si résolution échoue.
Cache :
Utilise `$dns_cache` global pour éviter appels répétés à `gethostbyaddr()`.
Exemple :
$hostname = gethost('8.8.8.8');
// Retourne: "dns.google" (ou "8.8.8.8" si échec)
Performance :
- Premier appel : ~50-200ms (requête DNS)
- Appels suivants : <1ms (cache)
---
isBanned #
Vérification du statut de bannissement d'une IP.
Note : Fonction non définie dans ce fichier, doit être dans le framework core ou un fichier inclus.
function isBanned(string $ip): bool
Usage attendu :
if(isBanned('192.168.1.42'))
{
// Refuser accès
}
Paramètres URL #
| Paramètre | Type | Description |
|-----------|------|-------------|
| `limit` | int | Nombre d'IPs à afficher (défaut: 80) |
| `detail` | ip | Afficher détails d'une IP spécifique |
| `ban` | ip | Bannir une IP (requiert modérateur) |
Workflow de bannissement #
1. Modérateur clique "Ban IP" depuis vue détaillée
↓
2. GET ?obj=current_users.php&ban=192.168.1.42
↓
3. Validation IP via Parser::sanitize()
↓
4. Vérification isBanned($user_ip) — BUG LIGNE 41: utilise $current_ip au lieu de $user_ip
↓
5. Récupération username modérateur (SELECT sur email_address)
↓
6. INSERT INTO banned_ips (offender, motive, tstamp)
↓
7. Affichage confirmation + refresh interface
Sécurité #
Contrôle d'accès #
if(secure('CURRENT_USERS_LEVEL_MODERATOR'))
{
// Actions autorisées
}
else forbids();
Seuls les modérateurs peuvent :
- Voir la liste des IPs
- Consulter les détails
- Bannir des IPs
Validation des entrées #
Toutes les IPs sont sanitizées :
$user_ip = Parser::sanitize($_GET['ban'], 'ip');
if($user_ip !== false)
{
// Utilisation sécurisée
}
Formats acceptés :
- IPv4 : `192.168.1.1`
- IPv6 : `2001:0db8:85a3::8a2e:0370:7334`
Protection anti-doublon #
Vérification avant ban :
if(!isBanned($user_ip)) // Note: BUG ligne 41 utilise $current_ip
{
// Procéder au ban
}
Locale #
Fichier : `getlocale('current_users')`
Variable : `$dialcu[]`
| Index | Description |
|-------|-------------|
| 0 | "Anonymous" (IP sans utilisateur) |
| 1 | Header colonne "IP Address" |
| 2 | Header colonne "Hostname" |
| 3 | Message "Aucune requête trouvée" |
| 4 | Confirmation bannissement réussi |
| 6 | Erreur "IP déjà bannie" |
| 7 | Erreur "IP invalide" |
| 8 | Label "IPs revendiquées" |
| 10 | Label "Utilisateurs multiples détectés" |
Auto-refresh #
Implémentation :
if($act == 0) // Pas d'action en cours
{
$cfg[25] .= '<meta http-equiv="Refresh" content="15">';
}
Comportement :
- Refresh désactivé pendant les actions (ban, détail)
- Refresh actif sur la liste principale
- Intervalle : 15 secondes
Désactivation :
Retirer le meta tag ou passer `$act = 1` manuellement.
Exemples d'usage #
Détecter multi-comptes #
1. Aller sur ?obj=current_users.php
2. Cliquer sur une IP suspecte
3. Si "Utilisateurs multiples détectés" apparaît :
→ Liste des comptes liés
→ Vérifier profiles pour abus
Bannir un spammeur #
1. Repérer IP dans la liste principale
2. Cliquer sur l'IP pour voir détails
3. Vérifier historique de requêtes (pattern suspect)
4. Cliquer "Ban IP: xxx.xxx.xxx.xxx"
5. Confirmation affichée, IP ajoutée à banned_ips
Analyser comportement anonyme #
?obj=current_users.php&detail=203.0.113.42
Affiche :
- "Anonymous" (pas de compte)
- Liste complète des pages visitées
- Patterns de navigation détectables
Problèmes connus #
Bug ligne 41 #
if(!isBanned($current_ip)) // ❌ Variable incorrecte
Devrait être :
if(!isBanned($user_ip)) // ✓ Variable correcte
Impact :
- `$current_ip` non défini → probablement `null`
- `isBanned(null)` retourne `false`
- Bannissement s'exécute même si IP déjà bannie
- Doublons possibles dans `banned_ips`
Correction appliquée : À intégrer dans la prochaine version.
---
Requêtes SQL non préparées (lignes 47, 91) #
'SELECT `username` FROM "'.$cfg['dbtable'].'" WHERE `email_address` = ?'
Risque : Si `$cfg['dbtable']` contient des caractères spéciaux ou provient d'une source non fiable.
Mitigation : `$cfg['dbtable']` est défini dans configuration core, pas exposé aux utilisateurs.
---
Résolution DNS bloquante #
`gethostbyaddr()` peut prendre jusqu'à 5 secondes si le DNS est lent.
Impact : Page listing peut être très lente avec beaucoup d'IPs.
Solutions :
1. Augmenter timeout PHP
2. Pré-calculer hostnames en background (cron)
3. Utiliser DNS asynchrone (non implémenté)
Dépendances #
- `Beamreactor\Database\SQL` — Requêtes préparées
- `Beamreactor\Sanitizer\Parser` — Validation IP
- `frameheader()` / `framefooter()` — Frame système
- `secure()` — Vérification permissions
- `forbids()` — Gestion accès refusé
- `isBanned()` — Vérification statut ban (externe)
- `sql_table_exists()` — Vérification existence table
Configuration #
| Variable | Usage |
|----------|-------|
| `$cfg[0]` | Base URL du site |
| `$cfg[25]` | Header HTML (meta refresh injecté ici) |
| `$cfg['dbtable']` | Nom table utilisateurs |
| `$key1`, `$key2` | Couleurs alternées pour tableaux |
Performance #
Liste de 80 IPs :
- Sans cache DNS : ~15-30 secondes (1 résolution = 200ms × 80)
- Avec cache DNS : ~1-2 secondes (résolutions en cache)
Optimisation recommandée :
Pré-calculer hostnames via cron et stocker dans `current_user.hostname`.
Cas d'usage typiques #
Monitoring en temps réel #
Laisser la page ouverte avec auto-refresh pour surveiller activité en direct.
Forensics après incident #
1. Identifier timestamp de l'incident
2. Filtrer IPs actives à ce moment
3. Analyser historique de navigation
4. Corréler avec logs applicatifs
Détection de bots #
Pattern typique :
- Pas d'utilisateur lié (Anonymous)
- 50+ requêtes/minute
- User-agent suspect
- Hostname générique (ex: `ec2-xxx.amazonaws.com`)
Améliorations futures #
- [ ] Filtrage par plage horaire
- [ ] Export CSV des IPs actives
- [ ] Graphiques d'activité par IP
- [ ] Intégration GeoIP (pays/ville)
- [ ] Whitelist d'IPs (protection contre ban accidentel)
- [ ] Historique des bans (qui a banni quand)
- [ ] Durée de ban configurable (actuellement permanent)