Je veux enregistrer dans une page l'activité "illégale" d'un visiteur en notant son adresse Ip, afin de le bannir.
Le but est d'empêcher le Flood, car l'une de mes pages s'affiche avec une variable GET.
Plutôt que copier ici une dizaines de lignes de code, je vous explique ma démarche :
1. Au chargement de la page, je contrôle que l'adresse Ip n'est pas présente dans la table "banni".
2. Si oui, j'affiche un message d'erreur.
3. Si non, le script s'exécute... Je vérifie le contenu de la variable GET demandée. Si elle est fantaisiste, j'ajoute l'adresse Ip du vilain à ma table "banni". Je le préviens par un message, car je suis un garçon poli.
Le hic se situe à ce niveau. Quand j'ajoute l'adresse Ip, la page semble se recharger. L'utilisateur voit alors le message d'erreur, pas le message d'avertissement : ce comportement me paraît fâcheux.
Voici le code...
$ip = $_SERVER['REMOTE_ADDR'];
try
{
$dbh = new PDO($database, $database_user, $database_password);
$dbh->beginTransaction();
$table_forbidden = $dbh->quote('forbidden_clients');
$sth = $dbh->prepare('SELECT ip FROM '.$table_forbidden.' WHERE ip = ?');
$sth->execute(array($ip));
$query_forbidden_ip = $sth->fetch(PDO::FETCH_ASSOC);
$sth->closeCursor();
}
catch(PDOException $e)
{
echo $e->getMessage(). "\n";
echo $e->getCode();
}
if (!(empty($query_forbidden_ip['ip'])))
{
$unauthorized = true;
}
if (!(isset($unauthorized)))
{
// le contenu habituel s'affiche, notamment...
if (isset($_GET['id']))
{
try
{
$dbh = new PDO($database, $database_user, $database_password);
$dbh->beginTransaction();
$table_visitor = $dbh->quote('visitor');
$sth = $dbh->prepare('SELECT foo FROM '.$table_visitor.' WHERE id = ?');
$sth->execute(array($_GET['id']));
$query_id = $sth->fetch(PDO::FETCH_ASSOC);
$sth->closeCursor();
}
catch(PDOException $e)
{
echo $e->getMessage(). "\n";
echo $e->getCode();
}
if (empty($query_id['id']))
{
$forbidden = true;
try
{
$dbh = new PDO($database, $database_user, $database_password);
$dbh->beginTransaction();
$table_forbidden = $dbh->quote('forbidden_clients');
$sth = $dbh->prepare('INSERT INTO '.$table_forbidden.' (ip, time) VALUES (?, ?)');
$sth->execute(array($ip, $time));
$dbh->commit();
$sth->closeCursor();
}
catch(PDOException $e)
{
echo $e->getMessage(). "\n";
echo $e->getCode();
}
}
}
}
else
{
// le message de banissement s'affiche
}
De plus, ma page se comporte différemment selon les navigateurs : sous Chrome, l'opération se déroule comme attendu, mais pas sous Firefox, avec Ubuntu (je ne n'utilise Windows).Auriez-vous une idée lumineuse à me soumettre ?
Comme je ne sais pas comment formuler brièvement le problème, notre ami Google m'est inutile.
Merci pour votre aide.
Cordialement,
Gaspard