Classes List

frdl\security\floodprotection\FloodProtection

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 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 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 
 94 
 95 
 96 
<?php
namespace frdl\security\floodprotection;
/** * https://stackoverflow.com/questions/3026640/quick-and-easy-flood-protection */
/* use frdl\security\floodprotection\FloodProtection; $FloodProtection = new FloodProtection('login', 10, 30); if($FloodProtection->check($_SERVER['REMOTE_ADDR'])){ header("HTTP/1.1 429 Too Many Requests"); exit("Hit some *"); } */

class FloodProtection
{
 protected $dir;
 protected $limit;
 protected $duration;
 protected $autoclean = true;
 protected $name;
 protected $pfx;

 public function __construct($name = ''$limit = 10$duration = 30$dir = null$autoclean = true){
 if(null === $dir){
 $dir = $this->getCacheDir('FP');
 }
 $this->dir = $dir;
 $this->name = $name;
 $this->pfx = 'fp_'  . strlen($this->name) .'_'sha1($this->name).'_';
 $this->autoclean = $autoclean;
 $this->limit = $limit;
 $this->duration = $duration;
 }

// Record and check flood.
// Return true for hit.
 public function check($id = null){
if(null === $id){
   $id = $_SERVER['REMOTE_ADDR'];
}
 
if(!is_dir($this->dir)){
  mkdir($this->dir0755true);
}
 
    $fp = fopen(rtrim($this->dir\DIRECTORY_SEPARATOR) . \DIRECTORY_SEPARATOR . $this->pfx . basename($id), 'a+');
    fwrite($fppack('L'time()));
    if(fseek($fp, -4 * $this->limit\SEEK_END=== -1) {
        return false;
    }
    $a = unpack('L'fread($fp4));  
    $time = reset($a);
    fclose($fp);
    if(time() - intval($time) < $this->duration) {
        if($this->autoclean){
            $this->prune();
        }
        return true;
    }
    return false;
 }
// Clean the pool.
 public function prune(){
    $handle = opendir($this->dir);
    while(false!==($entry=readdir($handle))){
        $filename = rtrim($this->dir\DIRECTORY_SEPARATOR) . \DIRECTORY_SEPARATOR . $entry;
        if(time() - filectime($filename) > $this->duration && substr($entry0strlen($this->pfx)) === $this->pfx){
            unlink($filename);
        }
    }
    closedir($handle);
  }


 public function getCacheDir($name = 'FP'){
    $name = strtoupper($name);
 
  $_ENV['FRDL_HPS_CACHE_DIR'] = ((isset($_ENV['FRDL_HPS_CACHE_DIR'])) ? $_ENV['FRDL_HPS_CACHE_DIR'
                   : sys_get_temp_dir() . \DIRECTORY_SEPARATOR . get_current_user(). \DIRECTORY_SEPARATOR . 'cache-frdl' . \DIRECTORY_SEPARATOR
  );
  
  
          $_ENV['FRDL_HPS_PSR4_CACHE_DIR'] = ((isset($_ENV['FRDL_HPS_PSR4_CACHE_DIR'])) ? $_ENV['FRDL_HPS_PSR4_CACHE_DIR'
                   : $_ENV['FRDL_HPS_CACHE_DIR']. 'psr4'\DIRECTORY_SEPARATOR
  );
 
 
  
          $_ENV['FRDL_HPS_FP_CACHE_DIR'] = ((isset($_ENV['FRDL_HPS_FP_CACHE_DIR'])) ? $_ENV['FRDL_HPS_FP_CACHE_DIR'
                   : $_ENV['FRDL_HPS_CACHE_DIR']. 'floodprotection'\DIRECTORY_SEPARATOR
  );  
 
 return (empty($name)) ? $_ENV['FRDL_HPS_CACHE_DIR'] : $_ENV['FRDL_HPS_'.$name.'_CACHE_DIR'];
   }

}