• User

    Script per la protezione contr massive downloads

    Ciao a tutti,

    causa forza maggiore il mio hosting mi ha vivamente consigliato l'installazione di questo script php che permetta di limitare il download proteggendo il sito da download di massa.

    <?php
    
    include "dload_cfg.php";
    
    mysql_query("CREATE TABLE IF NOT EXISTS `downloaded` (
      `ipadres` varchar(15) NOT NULL,
      `last_access` datetime NOT NULL,
      UNIQUE KEY `ipadres` (`ipadres`),
      KEY `last_access` (`last_access`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
    
    $path = addslashes($_SERVER['REQUEST_URI']);
    $ip = addslashes($_SERVER['REMOTE_ADDR']);
    $dl = false;
    
    // set here time delay for each download
    $delay = 10;
    
    $sql = sprintf("SELECT UNIX_TIMESTAMP(last_access) last_time FROM downloaded WHERE ipadres = '%s' ORDER BY last_access DESC", $ip);
    $res = mysql_query($sql);
    if (mysql_num_rows($res) > 0) {
    	$last_xs = mysql_result($res, 0, 'last_time')+$delay;
    	if ($last_xs < time()) {
    		mysql_query(sprintf("REPLACE downloaded SET ipadres = '%s', last_access = NOW()", $ip));
    		$dl = true;
    	} 
    } else {
    	$sql = sprintf("REPLACE downloaded SET ipadres = '%s', last_access = NOW()", $ip);
    	mysql_query($sql);
    	$dl = true;
    }
    
    if ($dl) {
    	$fullPath = $_SERVER['DOCUMENT_ROOT'].$path; 
    	if ($fd = fopen ($fullPath, "r")) {
    		$fname = basename($fullPath);
    		header('Content-type: application/octet-stream');
    		header('Content-Disposition: filename="'.$fname.'"');
    		header('Content-length: '.filesize($fullPath));
    		header('Cache-control: private'); 
    		while(!feof($fd)) {
    			$buffer = fread($fd, 2048);
    			echo $buffer;
    		}
    		fclose ($fd);
    		exit;
    	}
    } else {
    	   header('HTTP/1.0 503 Service Unavailable');
    	   die('You have to wait 10 seconds from last download before you can download another file - Please press BACK in your browser');
            
            
    }
    ?>
    

    Chi per cortesia puo' aiutarmi a modificarlo in questo modo:

    al momento lo script controlla la frequenza dei download per IP fissando come tempo minimo fra un download ed uno successivo un time delay di 10 sec.

    La mia idea e' quella di implementare anche il controllo del numero dei download in un determinato arco di tempo (ad esempio 1 ora dato che la table del dbase viene droppata in automatico a mezzo di un cronojob del server)

    Purtroppo non conosco il php se non a livello di base, idem MySQL
    ma occorrerebbe aggiungere un nuovo field ( 'counter')
    che viene incrementato ogni volta che un user esegue un download e quindi viene aggiornato anche l'orario nel record relativo al suo IP.
    Con un IF si potrebbe controllare il valore di tale counter e se superiore a x fare terminare lo script con la frase "numero massimi di download raggiunto. attendere un'ora"

    Grazie per il vostro aiuto.


  • User Attivo

    Nel codice, c'è una variabile, $delay (ritardo):

    // set here time delay for each download
    $delay = 10;

    Se vuoi un ritardo di un'ora invece di 10, tale valore va impostato con 60, per 2 ore va impostato 120 e così via.
    Inserire solo i secondi di ritardo.

    // set here time delay for each download
    **$delay = 60;

    **Ciao :ciauz:


  • User

    Ciao Sups,

    grazie ma forse non mi sono spiegato bene.

    Nel modo indicato da te un user (singolo IP) puo' solo scaricare 1 file all'ora ( e forse il valore va messo a 3600 per 1 ora e non a 60 come dici tu).

    Invece io, oltre ad indicare quanti files sono scaricabili ogni X secondi (al momento 10 sec) , vorrei fissare anche un certo numero di file massimi scaricabili in un'ora.

    E' chiaro che se volessi fissare 20 files in un ora mi basterebbe settare il delay a
    180 sec (cioe' un download ogni 3 minuti) ma non posso certo pretendere che ogni user attenda 3 minuti fra un download ed un altro 😉


  • User Attivo

    Hai ragion 60 = 1 minuto 😛 errore di calcolo 😄
    Adesso guardo come risolvere il tuo problema ed in caso ti faccio sapere 😄


  • User

    😄

    Grazie !


  • User

    Ho gia' trovato la soluzione al problema 😉

    Grazie mille 🙂