Dans le cadre de la programmation d'un forum, se pose à moi le problème du flood : en effet, j'aimerais empêcher les petits hackers de faire trop de requêtes à la fois, et ce sans utiliser MySQL dans mon script antiflood puisqu'un serveur MySQL est vite saturé
J'aimerais donc votre avis sur un petit script que j'ai écrit : y a-t-il des failles possibles, si oui lesquelles, et quels seraient les éléments à améliorer pour m'en sortir sans base MySQL ?
Le principe est simple : à partir des variables $intervalle et $max_acces, le script empêche un visiteur de charger plus de $max_acces fois une page pendant $intervalle secondes.
Voici donc le code !
CODE
<?php
$intervalle = 3;
$max_acces = 10;
if (!file_exists('cache'))
$cache = '';
else
$cache = file_get_contents('cache');
$good = false;
$current = time();
$temp = $cache;
while (true) {
$pos = strrpos($temp, "\n");
$time = substr($temp, $pos + 1, 10);
if ($time < $current - $intervalle)
break;
$temp = substr($temp, 0, $pos);
}
$last = substr($cache, $pos)."\n";
$f = fopen('cache', 'w');
fputs($f, $last.$current.' '.str_replace("\n", null, $_SERVER['REMOTE_ADDR']));
fclose($f);
str_replace(' '.$_SERVER['REMOTE_ADDR']."\n", null, $last, &$nb);
if ($nb > $max_acces)
die('Trop d\'accès en peu de temps ! Seriez-vous un méchant ? Ou pire ? Une méchante ???');
/*
A partir d'ici, on écrit le reste du code (ou bien sûr, on utilise un include)
*/
?>
$intervalle = 3;
$max_acces = 10;
if (!file_exists('cache'))
$cache = '';
else
$cache = file_get_contents('cache');
$good = false;
$current = time();
$temp = $cache;
while (true) {
$pos = strrpos($temp, "\n");
$time = substr($temp, $pos + 1, 10);
if ($time < $current - $intervalle)
break;
$temp = substr($temp, 0, $pos);
}
$last = substr($cache, $pos)."\n";
$f = fopen('cache', 'w');
fputs($f, $last.$current.' '.str_replace("\n", null, $_SERVER['REMOTE_ADDR']));
fclose($f);
str_replace(' '.$_SERVER['REMOTE_ADDR']."\n", null, $last, &$nb);
if ($nb > $max_acces)
die('Trop d\'accès en peu de temps ! Seriez-vous un méchant ? Ou pire ? Une méchante ???');
/*
A partir d'ici, on écrit le reste du code (ou bien sûr, on utilise un include)
*/
?>
Auriez-vous des conseils à me donner pour améliorer le script ? Peut-être que je ne devrais surtout pas faire comme cela, qui sait
Bonne soirée et merci d'avance !
EDIT : Voir plus bas (post #3) pour la nouvelle version