Anti flood basique - MySQLi

  Information

Les anti flood sont importants pour vos sites web.

Cela empeche surtout les robots de spammer vos sites web, en donnant une limite de temps entre chaque appel de pages.

Le principe :

  • Donner un temps entre chaque chargement de page, 10 secondes par exemple
  • Le code envoie une requete avec l'ip du visiteur + l'heure à laquel une page est chargée.
  • Pour la vérification, si l'ip du visiteur existe et que le temps est inférieur à 10 secondes, c'est qu'il spam très certainement

Information sur les mises à jour

Dernière mise à jour :

    19 Sept 2019
    refactoring du code en PHP 7
    fonctionnement du code vérifié

14 263  vues
Compatibilité du code
PHP 5, PHP 7 et PHP 8
  code source classé dans   Sécurité

 
 01    
 02    
 03    
 04    
 05    
 06    
 07    
 08    
 09    
 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    
 45    
 46    
 47    
 48    
 49    
 50    
 51    
 52    
 53    
 54    
 55    
 56    
 57    
 58    
 59    
 60    
 61    
 62    
                               
/*------------------------------*/
/*
Titre : Anti flood basique - MySQLi

Date édition : 13 Jan 2007
Date mise a jour : 19 Sept 2019

Rapport de la maj:
- refactoring du code en PHP 7
- fonctionnement du code vérifié
*/
/*------------------------------*/?>
CREATE TABLE flood (
ip varchar(18) NOT NULL default '',
dernier int(11) NOT NULL default '0',
PRIMARY KEY (ip)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

<?php

// COMMENT PROCà‰DER ??


$time_flood = '10'; // 10 secondes

$db_server = 'localhost'; // Adresse du serveur MySQL
$db_name = ''; // Nom de la base de données
$db_user_login = 'root'; // Nom de l'utilisateur
$db_user_pass = ''; // Mot de passe de l'utilisateur

// Ouvre une connexion au serveur MySQL
$conn = mysqli_connect($db_server,$db_user_login, $db_user_pass, $db_name);

// ip du client
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}

// 1° d'abord commencer par supprimer tout ceux dont le temps a expirer
$conn->query("DELETE FROM flood WHERE dernier + $time_flood < " . time());

// 2° ensuite prenez l'ip du visiteur
$q = $conn->query("SELECT dernier
FROM flood
WHERE ip='$ip'");

// 3° Si l'Ip du visiteur est déjà  dans la table, ai !!
if($q->num_rows > 0 )
echo 'vous spammez !';


// 4° sinon tout va bien, reste plus qu'a insérer
// l'ip de votre visiteur dans la table

else mysql_query("INSERT INTO flood
VALUES ('$ip', '" . time() . "')");

?>

      Fonctions du code - Doc officielle PHP

Détail    php.net  
Description
Versions PHP
    echo
Affiche une chaîne de caractères
PHP 4, 5, 7 et 8
    empty
Détermine si une variable est vide
PHP 4, 5, 7 et 8
    mysqli_connect
Alias de mysqli::__construct
PHP 5, 7 et 8
    mysql_query Envoie une requête à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLèTE en PHP 5.5.0, supprimée en PHP 7.0.0
    time
Retourne l'horodatage UNIX actuel
PHP 4, 5, 7 et 8

[6]

  • avatar

    Invité

    06 Aout 2010 à 19:52

     Salut à tous, en faite il faut faire comme ça: <?php 

    $time_flood '30'// 30 secondes 
    ?>
    Merci d'avance

  • avatar

    KOogar

    13 Juin 2010 à 14:33

    Pour monter la table tu peux utiliser phpMyAdmin et le reste du code c'est du pur php donc utilise un script avec une extension php  

  • avatar

    Invité

    13 Juin 2010 à 13:46

    bonjour, juste une question, au niveau du serveur, sa se pose dans quelle fichier et a quel place

  • avatar

    KOogar

    10 Jan 2010 à 23:21

    Merci pour le signalement. C'est corrigé, il y avait un petit problème de cache avec cette page.

  • avatar

    Invité

    10 Jan 2010 à 18:42

    Joli

    if(mysql_num_rows($resultat) > ???)

  • avatar

    Furious

    19 Mars 2008 à 10:42

    Fonctionne très bien ! Par contre pour ceux qui sont un peu embrouillés, il faut prendre juste la partie : "Comment procéder". ;)


 Autres snippets qui pourraient vous intéresser

Moteur de recherche basique / MySQLi

Compatibilité : PHP 5, PHP 7, PHP 8

Le mot est entré via 1 formulaire puis la recherche se fait sur la table SQL. La variable $recherche est envoyée par le formulaire qui lui est fourni dans le source.

Ouvrir une connexion MySQLi

Compatibilité : PHP 7, PHP 8

Exemples MySQL dans la syntaxe MySQLi et PDO. Trois façons d'ouvrir une connexion à MySQL (procédural, orienté objet et PDO

Sondage complet MySQLi + PHP

Compatibilité : PHP 5, PHP 7, PHP 8

Un sondage avec une seule table SQL et avec une vérification de l'ip afin de vérifier si le visiteur a déjà voté ou n'a pas encore voté.

* Requêtes exécutées avec Recherche Contextuelle

  Les derniers scripts PHP / MySQL

Zenphoto 1.6.8

logo Zenphoto
Langue langue fr
Date  aujourd'hui
Taille 15 Mo
Catégorie Galeries

EasyPHP PHP 8.5 for Devserver 17.0

logo EasyPHP
Langue langue fr
Date  hier
Taille 24 Mo
Catégorie Easyphp

Deltacms 6.0.03

logo Deltacms
Langue langue fr
Date 12 Mars 2026
Taille 7 Mo
Catégorie CMS

OsTicket 1.18.3

logo osTicket
Langue langue fr
Date 12 Mars 2026
Taille 49 Mo
Catégorie Services

WebCalendar 1.2.7

Script PHP / MySQL
Langue langue fr
Date 11 Mars 2026
Taille 2 Mo
Catégorie Calendriers

Web ERP Accounting 5.0.1

logo Web ERP Accounting
Langue langue us
Date 11 Mars 2026
Taille 69 Mo
Catégorie Logiciels

  13 Jan 2007

Information sur les mises à jour

Dernière mise à jour :

    19 Sept 2019
    refactoring du code en PHP 7
    fonctionnement du code vérifié

14 263 Vues
Compatibilité du code
PHP 5, PHP 7, PHP 8