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_ipsdoit exister - 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 :
Retourne : Hostname ou IP si résolution échoue.
Cache :
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 |
|-----------|------|-------------|
| 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 |
| 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_ipnon défini → probablementnullisBanned(null)retournefalse- 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 #
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éesBeamreactor\Sanitizer\Parser— Validation IPframeheader()/framefooter()— Frame systèmesecure()— Vérification permissionsforbids()— 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
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)