Pour commencer, il vous faut créer une table sur votre base de données (si vous n'en avez pas, passez à la seconde solution

). Je vous donne une structure d'exemple, changez-la comme vous voulez pour l'adapter à vos besoins :
Code : SQL | CREATE TABLE `ban` (
`ban_id` MEDIUMINT( 9 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`ban_ip` INT NOT NULL ,
UNIQUE (`ban_ip`)
);
|
Cela fait, nous allons créer un nouveau fichier dont le code ne vous sera donné qu'en guise d'exemple. Prenez note que je n'ai pas pris soin de protéger les codes, car vous seuls savez comment les intégrer à votre site web et à votre interface d'administration.
Vous devez protéger l'accès à ces sections ! Bien entendu, il va de soi que je ne vous donnerai pas de fichiers complets, seulement les parties concernées.
Bannir une adresse IP
Pour bannir une adresse IP, nous suivrons cette démarche :
- on affiche un formulaire demandant l'adresse à bannir ;
- si le formulaire est posté, on vérifie la validité de l'adresse IP ;
- si celle-ci est valide, on la convertit en entité numérique grâce à ip2long(), sinon on réaffiche le formulaire avec une erreur ;
- si tout est valide, on insère une entrée dans notre table et on affiche un message d'information.
Tout d'abord, le formulaire :
Code : HTML | <form action="ban.php" method="post">
<fieldset>
<legend>Bannir une adresse IP</legend>
<p><label for="ip">Adresse à bannir : </label></p>
<input type="text" name="ip" id="ip" />
<input type="submit" value="Bannir" />
</fieldset>
</form>
|
Pensez bien à remplacer l'action du formulaire pour y donner le bon nom de page vers laquelle poster. Pour ceux qui se posent la question, la balise
<label></label> sert à joindre un bout de texte à un champ de formulaire. Ainsi, en cliquant sur «
Adresse à bannir », le focus sera donné au champ dont l'id est «
ip ». Très pratique.
Maintenant, on va traiter les données de ce formulaire. Le code ci-dessous suppose que vous ayez une connexion MySQL active. Il reprend le formulaire ci-dessus et l'inclut dans le cas où il n'a pas été posté :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | <?php
$isset = isset($_POST['ip']); //true si le formulaire est posté
$erreur = false; //On change cette valeur à la moindre erreur
if ($isset) {
//Si le formulaire a été posté
if (!empty($_POST['ip'])) {
$ip = ip2long($_POST['ip']);
if ($ip != false && $ip != -1) {
//Si l'ip est valide
require ('libs/div/is_ban.php');
if (!is_ban($ip)) {
mysql_query('INSERT INTO ban (`ip`) VALUES(\'' . $ip . '\')');
print('Cette adresse est désormais non-autorisée.');
}
else
print ('Cette adresse est déjà bannie.');
}
else
$erreur = 1; //L'ip est invalide, erreur #1
}
else
$erreur = 0; //Le champ est vide, erreur #0
}
if (!$isset || $erreur !== false) {
//Si le formulaire n'a pas été posté ou qu'une erreur a été détectée
$erreurs = array('Vous devez entrer une adresse ip.', 'L\'adresse ip est invalide.');
if ($erreur !== false) {
//Si on a une erreur, on l'affiche
print('<p style="color: red; font-weight: bold;">' . $erreurs[$erreur] . '</p>');
}
//On affiche le formulaire
print ('<form action="ban.php" method="post">
<fieldset>
<legend>Bannir une adresse IP</legend>
<p><label for="ip">Adresse à bannir : </label></p>
<input type="text" name="ip" id="ip" />
<input type="submit" value="Bannir" />
</fieldset>
</form>');
}
?>
|
Je vous l'ai dit, c'est super simple ! À vous d'inclure ce code à votre panneau d'administration, et je le répète, protégez-le !
La fonction
ip2long() retourne l'adresse IP sous forme d'entité numérique, je l'ai dit. Si l'adresse IP est invalide, elle retourne -1 avec PHP3 et PHP4, tandis qu'avec PHP5, elle retourne
false : un caprice. Vous pouvez modifier le script pour n'effectuer que le test logique qui correspond à la version de PHP que vous utilisez, si vous la connaissez (sinon, phpinfo).
Obtenir la liste des adresses bannies
Pour voir la liste des adresses bannies, il nous suffit de faire une simple requête
SELECT sur notre table. Lorsque l'on aura écrit le script pour débannir des adresses, il serait astucieux de placer, sur chaque adresse de cette liste, des liens pour débannir.

Le code, vous êtes capables de le faire seuls, je l'espère.

Enfin, pour rassurer les plus inquiets (le code suppose que vous avez une connexion MySQL active) :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
//Quoi de plus bête comme requête :p
$req = mysql_query("SELECT * FROM ban");
if($res = mysql_fetch_assoc($req)) {
print('<ul>');
do {
print ('<li>' . long2ip($res['ban_ip']) . '</li>');
} while($res = mysql_fetch_assoc($req));
print ('</ul>');
}
else
print ('Aucune adresse IP bannie.'); //Personne de banni, on le signale
?>
|
C'est très simple et encore une fois, je vous laisse le soin de protéger le tout efficacement.
Débannir une adresse IP
Pour débannir une adresse, nous n'avons qu'à supprimer l'entrée correspondante dans la base de données. Pour rappel, afin de supprimer une entrée dans une table MySQL, nous devons utiliser la requête
DELETE. Voici un code tout simple :
Code : PHP | <?php
if (isset($_GET['ip'])) {
mysql_query('DELETE FROM ban WHERE ban_ip=\'' . $_GET['ip'] . '\'');
if (mysql_affected_rows() == 0)
print ('Cette adresse IP n\'était pas bannie.');
else
print ('L\'adresse IP a été débannie.');
}
else
print ('Vous n\'avez spécifié aucune adresse IP.');
?>
|
Vous pouvez maintenant ajouter les liens à votre liste d'adresses IP, avec cette ligne dans votre boucle par exemple :
Code : PHP | print ('<li><a href="supp.php?ip=' . $dselect['ban_ip'] . '" title="Débannir cette adresse">' . long2ip($dselect['ban_ip']) . '</a></li>');
|
Voilà, c'est tout pour MySQL, vous pouvez passer à la dernière partie qui consiste à restreindre l'accès aux adresses IP bannies (non, ça ne se fait pas tout seul

).