Location: PHPKode > scripts > Request flood protection > request-flood-protection/flood-protection.php
<?php
/*
+----------------------------------------------+
|                                              |
|       PHP MySQL Flood protection class       |
|                                              |
+----------------------------------------------+
| Filename   : flood-protection.php            |
| Created    : 19-Sep-05 3:48 GMT              |
| Created By : Sam Clarke                      |
| Email      : hide@address.com   |
| Version    : 1.0                             |
|                                              |
|                                              |
| Modified   : 19-Sep-05 14:44 GMT             |
|         BY : Sam Clarke                      |
|                                              |
+----------------------------------------------+


+---------------------------------------+
|                                       |
|        MySQL sql to make tabke        |
|                                       |
+---------------------------------------+
|                                       |
| CREATE TABLE `floodprotection` (      |
|  `IP` char(32) NOT NULL default '',   |
|  `TIME` char(20) NOT NULL default '', |
|  PRIMARY KEY  (`IP`)                  |
| ) TYPE=MyISAM;                        |
|                                       |
+---------------------------------------+

LICENSE

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License (GPL)
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

To read the license please visit http://www.gnu.org/copyleft/gpl.html

*/

class flood_protection {

  var $secs = 1; // Number or secounds between a request
  
  var $keep_secs  = 600; // Number of secounds to keep the user registered

  // MySQL config
  var $host = 'localhost'; // MySQl host
  var $password; // MySQL password
  var $username; // MySQL username
  var $db; // MySQL username
  var $link; // MySQl link

  // function to connect to MySQL
  function db_connect() {
    $this -> link = mysql_connect($this -> host, $this -> username, $this -> password); // connect to MySQL
    if(!$this -> link) { // test connection
      return false;
    }
    // select db and check it worked
    if(mysql_select_db($this -> db)) {
      return true;
    }
    return false;
  }

  // add user ip address to database
  function register_user($ip) {
    // insert ip and currnt time into database
    $result = mysql_query('INSERT INTO `floodprotection` (`IP`,`TIME`) VALUES(\' '. mysql_real_escape_string( $ip, $this -> link ) . '\', \''. time() .'\') ', $this -> link);
    if(!$result) {
      return false;
    }
    return true;
  }

  // check to see if the user is flooding
  function check_request($ip) {
    if(!$this -> db_connect()) {
      return false; // if we cannot connect to db then return the user isnt flooding as we don't know
    }
    if($this -> user_in_db($ip)) { // find out if the user is in the db
      $return = $this -> user_flooding($ip); // if they are check if there flooding
      $this -> update_user($ip); // update there last request
      $this -> remove_old_users(); // remove the old users
      $this -> close_db(); // close db connection
      return $return; // return if there flooding or not
    } else {
      $this -> register_user($ip); // if there not in the db add them
      $this -> remove_old_users(); // remove the old users
      $this -> close_db(); // close db connection
      return false; // sonce there not in the db there not flooding so return false
    }
  }

  function user_in_db($ip) {
    // query db to see if there in
    $result = mysql_query('SELECT `TIME` FROM `floodprotection` WHERE `IP` = \' '. mysql_real_escape_string( $ip, $this -> link ) . '\' LIMIT 1', $this -> link);
    if(mysql_num_rows($result) > 0) { // if more than 0 records are returned there in
      return true;
    }
    return false; // other wise return false
  }

  function user_flooding($ip) {
    // query db to see if there flooding
    $result = mysql_query('SELECT `TIME` FROM `floodprotection` WHERE `IP` = \' '. mysql_real_escape_string( $ip, $this -> link ) . '\' AND `TIME` >= ' . (time() - $this ->  secs) . ' LIMIT 1', $this -> link);
    if(mysql_num_rows($result) > 0) { // if more than 0 records are returned there flooding
      return true;
    }
    return false; // other wise return false
  }

  function update_user($ip) {
    // query db to update the user last request
    $result = mysql_query('UPDATE `floodprotection` SET `TIME` = \'' . time() . '\' WHERE `IP` = \' '. mysql_real_escape_string( $ip, $this -> link ) . '\'', $this -> link);
  }
  
  function remove_old_users() {
    // Query db to remove all the old users
    mysql_query('DELETE FROM `floodprotection` WHERE `TIME` <= \'' . (time()- $this -> keep_secs) . '\'', $this -> link);
  }

  function close_db() {
    mysql_close($this -> link);
  }
}

?>
Return current item: Request flood protection