Lecteur Markdown
BANNA_DOCUMENTATION
Banna - Ban Manager #
Gestion des bannissements IP et plages CIDR.
Namespace: `Beamreactor\Plugins\Banna`
Version: 5.0.1
Niveau requis: `BANNA_LEVEL_MODERATOR`
Vue d'ensemble #
Module de bannissement permettant de bloquer des adresses IP individuelles ou des plages CIDR entières. Les bans sont persistants en base de données et vérifiés à chaque requête entrante par le moteur.
Fonctionnalités #
- Bannissement d'IP individuelles
- Bannissement de plages CIDR (ex: `192.168.0.0/24`)
- Motif de bannissement optionnel
- Historique avec horodatage
- Pagination de la liste des bans
- Confirmation JavaScript avant suppression
Actions #
| Action | Description |
|--------|-------------|
| `add` | Ajoute une IP ou plage CIDR à la liste des bans |
| `remove` | Supprime un ban existant |
| `view` | Affiche les détails d'un ban |
Fonctions #
ip_in_cidr #
Vérifie si une IP appartient à une plage CIDR.
ip_in_cidr(string $cidr, string $ip): bool
Paramètres:
- `$cidr` — Notation CIDR (ex: `192.168.0.0/24`) ou IP simple
- `$ip` — Adresse IP à vérifier
Retour: `true` si l'IP est dans la plage.
Exemple:
ip_in_cidr('10.0.0.0/8', '10.45.67.89'); // true
ip_in_cidr('192.168.1.0/24', '192.168.2.1'); // false
is_valid_cidr #
Valide une notation CIDR ou une IP simple.
is_valid_cidr(string $cidr): bool
Paramètres:
- `$cidr` — IP ou notation CIDR à valider
Retour: `true` si valide.
Exemples valides:
- `192.168.1.1`
- `10.0.0.0/8`
- `172.16.0.0/12`
cidr_to_range #
Convertit une notation CIDR en plage lisible.
cidr_to_range(string $cidr): string
Paramètres:
- `$cidr` — Notation CIDR
Retour: Plage au format `IP_début - IP_fin`.
Exemple:
cidr_to_range('192.168.1.0/24'); // "192.168.1.0 - 192.168.1.255"
cidr_to_range('10.0.0.0/8'); // "10.0.0.0 - 10.255.255.255"
handleAdd #
Traite l'ajout d'un ban.
handleAdd(): void
Valide l'entrée, vérifie les doublons, insère en base. Gère les IP simples et les plages CIDR.
handleRemove #
Supprime un ban.
handleRemove(string $ip): void
Paramètres:
- `$ip` — IP ou CIDR à débannir
handleView #
Affiche les détails d'un ban.
handleView(string $ip): void
Paramètres:
- `$ip` — IP ou CIDR à consulter
Informations affichées:
- Adresse/plage
- Type (IP simple ou CIDR)
- Date de bannissement
- Motif
- Requête ayant déclenché le ban (si disponible)
- User-Agent (si disponible)
showList #
Affiche la liste paginée des bans.
showList(int $offset, int $itemsPerPage, int $total, int $page, int $totalPages): void
Structure de la table #
CREATE TABLE banned_ips (
id INT AUTO_INCREMENT PRIMARY KEY,
offender VARCHAR(50) NOT NULL,
motive VARCHAR(255),
tstamp DATETIME,
is_cidr TINYINT(1) DEFAULT 0,
cidr_range VARCHAR(50),
query TEXT,
useragent TEXT,
UNIQUE KEY (offender)
);
Locale #
Clés utilisées dans `$dialban`:
| Index | Description |
|-------|-------------|
| 0 | Label date |
| 2 | Message suppression OK |
| 3 | Message ajout OK |
| 4 | Bouton ajouter |
| 6 | Lien retour |
| 7 | User-agent inconnu |
| 8 | Placeholder IP |
| 9 | Label motif |
| 12 | Message liste vide |
| 13 | Bouton supprimer |
| 14 | Motif par défaut |
| 15 | Label actions |
| 16 | Placeholder motif |
| 17 | Erreur doublon |
| 18 | Erreur IP invalide |
| 19 | Titre formulaire |
| 20 | Aide format CIDR |
| 21 | Message ajout CIDR |
| 22 | Label plage couverte |
| 23 | Erreur ban introuvable |
| 24 | Titre détails |
| 25 | Label adresse |
| 26 | Label type |
| 27 | Type plage |
| 28 | Label étendue |
| 29 | Type IP simple |
| 30 | Label requête |
| 31 | Label user-agent |
| 32 | Titre confirmation |
| 33 | Message confirmation |
Utilisation #
Bannir une IP #
POST ?obj=banna.php
ban=add
IP=192.168.1.100
motive=Spam répété
Bannir une plage #
POST ?obj=banna.php
ban=add
IP=45.0.0.0/8
motive=Datacenter malveillant
Vérifier un ban (depuis un autre module) #
$ip = $_SERVER['REMOTE_ADDR'];
$banned = SQL::queryValue(
"SELECT 1 FROM banned_ips WHERE offender = ? OR (is_cidr = 1 AND ? REGEXP REPLACE(offender, '/', '.*'))",
[$ip, $ip]
);
// Ou utiliser ip_in_cidr pour une vérification précise
$bans = SQL::query("SELECT offender FROM banned_ips");
foreach ($bans as $ban)
{
if (ip_in_cidr($ban['offender'], $ip))
{
// IP bannie
break;
}
}
Notes #
- Les plages CIDR larges (`/8`, `/16`) peuvent couvrir des millions d'adresses
- Le masque doit être entre 0 et 32
- La suppression d'un ban CIDR libère toute la plage
- Les bans sont vérifiés par le moteur avant tout traitement de requête