La communauté ALL HTML c'est 58827 membres à ce jour dont 3 inscrits aujourd'hui et 32 depuis une semaine.

Communauté ALL HTML : FabHacker

Utiliser un système antiflood pour vos formulaires

Cet article est actuellement publié sur le site.

Photo de FabHacker Article publié le lundi 23 octobre 2006 par FabHacker.
Cet article est classé dans les catégories « PHP, SQL »

Les scripts que je donne dans ce tutoriel vous permettront de faire face au flood dans tous vos formulaire en utilisant très simplement deux fonctions.

Introduction


Tout d'abord, qu'est ce que le flood? Tout simplement l'utilisation abusive d'un formulaire, dans le cadre d'un site dynamique.


Par exemple, vous avez un formulaire sur votre site vous permettant de poster un message sur un forum. L'utilisateur le rempli et envoie le formulaire, le script ajouter.php receptionne les données, les vérifie et enregistre les données dans la base de donnée: le message est ajouté.

Seulement, rien n'empêche à utilisateur vous voulant du mal, de faire un script envoyant à votre script ajouter.php une multitude de requête pendant une longue période. Et le script enregistrerait une multitude de message identique (ou non) et surtout inutiles.

Cela ne sert à rien, mais on n'est jamais à l'abri d'un lamer qui voudrais déteriorer le contenu de votre site en remplissant massivement votre base de donnée. De plus, un script de flood est très aisé à faire par le biai de Javascript...


Mais le script de filtrage antiflood peut être utile dans certaines autres applications. En restant sur l'exemple du message de forum, il suffirait que l'utilisateur clique par mégarde deux fois sur le bouton envoyer suffisament rapidement pour que son message soit doublé, ce qui est donc un effet indésiré.


C'est pourquoi un script de filtrage anti-flood est nécessaire pour tous les formulaires qui composent votre site. De plus il sera totalement transparent dans le cadre d'une utilisation normale du site.


La table SQL


Il va nous falloir une table SQL pour enregistrer plusieur données. Nous allons enregistrer un identifiant textuel de formulaire, un identifiant d'utilisateur, la date de dernière utilisation du formulaire, et le délai accordé avant la prochaine utilisation.
Voici la structure de la table:

table.sql
CREATE TABLE util_antiflood ( blockid int(11) NOT NULL auto_increment, formname varchar(16) NOT NULL default '', userid int(11) NOT NULL default '0', lastpost int(11) NOT NULL default '0', delai int(11) NOT NULL default '0', PRIMARY KEY (blockid) )


Les fonctions


Et maintenant voici les deux fonctions qui vont servir à utiliser à bien cette table. Il n'y en a que deux: la première sert à définir une contrainte pour un formulaire donné et pour un utilisateur donné, la seconde est de type booléenne et indique si l'utilisateur à le droit (ou non) d'utiliser un formulaire.
Voici le code à inclure:

fct_antiflood.php
<?php // ------------------------------------ // FONCTIONS DE GESTION DE L'ANTIFLOOD // v1.0 // par FabHacker // ------------------------------------ // LISTE DES FONCTIONS // definir_antiflood($formname,$userid,$lastpost,$delai) - Ajoute un filtre pour un formulaire et un userid donné // doit_attendre_antiflood($formname,$userid) - Booléen indiquant si l'utilisateur peut poster ou pas // Nom de la table contenant les variables define( _TABLE_ANTIFLOOD , 'util_antiflood' ); // Ajoute un filtre pour le formulaire $formname et pour l'userid $userid. // La date du post est $lastpost et le delai $delai doivent être donnés. function definir_antiflood($formname,$userid,$lastpost,$delai) { // Vérification de l'existance de la ligne dans la table $sql = "SELECT blockid FROM " . _TABLE_ANTIFLOOD . " WHERE formname = '$formname' AND userid = $userid"; $resultat = mysql_query($sql); if(mysql_num_rows($resultat)) { // La ligne existe, on la met à jour $sql = "UPDATE " . _TABLE_ANTIFLOOD . " SET lastpost = $lastpost, delai = $delai WHERE formname = '$formname' AND userid = $userid"; $resultat = mysql_query($sql); } else { // SInon on l'ajoute $sql = "INSERT INTO " . _TABLE_ANTIFLOOD . " VALUES ('','$formname','$userid','$lastpost','$delai')"; $resultat = mysql_query($sql); } } // Booléen indiquant si l'utilisateur peut poster ou pas // true : l'utilistateur doit attendre // false : l'utilisateur peut poster function doit_attendre_antiflood($formname,$userid) { // On va chercher la date et le delai dans la table $sql = "SELECT lastpost,delai FROM " . _TABLE_ANTIFLOOD . " WHERE formname = '$formname' AND userid = $userid"; $resultat = mysql_query($sql); $antiflood = mysql_fetch_object($resultat); // Retourne le booléen if( time() < ($antiflood->lastpost + $antiflood->delai) ) return true; else return false; } ?>


Exemple d'utilisation


Voila un bref exemple pour voir comment tout cela fonctionne.
Et vous verrez que c'est très simple, discret !

exemple.php
<?php // Début du script qui receptionne les données [...] // Constante de paramètrage à inclure où vous le désirez // Ceci est bien entendu optionnel define( _ANTIFLOOD_DELAI_FORM1 , 5 ); // delai de 5 secondes pour 'form1' // Ajout d'un message if($ajouter_message == 1) { $formulaire = 'form1'; // identifiant du formulaire $userid = $_SESSION['userid']; // identifiant de l'utilisateur // On vérifie si l'utilisateur doit attendre pour poster $attente = doit_attendre_antiflood($formulaiure,$userid); if(!$attente) { // L'utilisateur peut poster // Insertion dans la base de donnée $sql = "..."; $resultat = mysql_query($sql); [...] $date = time(); // date de dernière utilisation $delai = _ANTIFLOOD_DELAI_FORM1; // délai avant la prochaine // Définition d'un filtre antiflood definir_antiflood( $formulaire , $userid , $date , $delai ); } else { // L'utilisateur doit attendre print('<p align="center"><font color="red">Merci de respecter un temps d\'attente entre deux envois...</font></p>'); } } // Poursuite du script... [...] ?>


Extension du script


  1. Vous l'avez remarqué, on se sert d'un identifiant utilisateur pour identifier qui à poster. Cela nécessite donc que votre site gère plusieurs compte utilisateurs, mais vous pouvez également modifier la table et le script pour faire en sorte d'identifier les utilisateurs selon un/des critère(s) différent(s).
  2. Ici on identifie les formulaires par une chaine textuel, et on indique le délai de postage arbitrairement. Une autre solution consisterai à faire une table SQL qui contient des données pour chacun des formulaires sous la structure suivante:

  3. formid - identifiant de formulaire (clée primaire)
    nom - identifiant [u]unique[/u] du formulaire sous forme d'une chaine textuel
    delai - délai d'attente pour nouvelle utilisation

    Ainsi il ne serait plus utile d'entrer le délai en paramètre dans la fonction qui définit les filtres.


En espérant que l'utilisation de ce script vous facilite le dévelloppement de vos sites web en évitant des attaques de flood et en préservant votre contenu...!

ACCÉS COMMUNAUTÉ

Rejoignez ALL HTML

Publiez vos articles, actualités, communiqués ... Donnez votre avis, partagez votre réseau, rencontrez d'autres membres et participez à la vie de la communauté.