Mettre des quotas de téléchargement
Pour fonctionner, ce script a besoin de 2 tables SQL, l'une pour gérer les fichiers et l'autre pour les quotas.La table files contient 2 champs qui nous intéressent:
- id qui est l'identifiant unique du fichier
- url qui est l'url (relative ou absolue) du fichier
La table downloads contient les statistiques de téléchargement:
CREATE TABLE downloads (
id int(8) NOT NULL AUTO_INCREMENT,
ip varchar(25) NOT NULL DEFAULT '',
ref varchar(50) NOT NULL DEFAULT '',
datedownload timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
taille int(8) NOT NULL DEFAULT '0',
useragent varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=MyISAM;
id int(8) NOT NULL AUTO_INCREMENT,
ip varchar(25) NOT NULL DEFAULT '',
ref varchar(50) NOT NULL DEFAULT '',
datedownload timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
taille int(8) NOT NULL DEFAULT '0',
useragent varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=MyISAM;
Le script
<?
// variables initiales
$maxdown=30; // Nombre de téléchargements autorisés par jour et par IP
$volmaxperday=8000*1024*1024; // Volume maximal par jour (8Mo)
$id = $_GET["id"]; // id du fichier
$ip=getenv("REMOTE_ADDR"); // IP du visiteur
$ua=$_SERVER["HTTP_USER_AGENT"]; // Juste pour des stats (peut être utilisé pour bloquer les robots)
// Evite que les accélérateur de downloads démarrent 5 téléchargements d'un coup...
srand ((double) microtime() * 1000000);
$randnum = rand(1,3);
sleep($randnum);
// Suppression des stats de plus d'un jour
$resquota=mysql_query("DELETE FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY) < now()");
// Récupération de l'url du fichier
$res = mysql_query("SELECT url FROM files WHERE id=$id");
if (!(list($url) = mysql_fetch_row($res))) {exit;}
// Récupération de la taille du fichier
$size=filesize($url);
// Test sur le quota journalier de l'IP
$resquota = mysql_query("SELECT COUNT(*) AS compte FROM downloads WHERE ((DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()) AND (ip='$ip'))");
list($ipcount)=mysql_fetch_row($resquota);
if ($ipcount>=$maxdown) die("Quota de l'IP dépassé");
// Test sur le quota journalier
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>$volmaxperday) die("Quota journalier dépassé");
// Test sur le quota par 15'
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 15 MINUTE) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>($volmaxperday/24/4)) die("Quota du 1/4h dépassé");
$sql_quota = "INSERT INTO downloads (ip,ref,datedownload,taille,useragent) VALUES ('$ip',$id,now(),$size,'$ua')";
$res_quota = mysql_query($sql_quota);
$filename = basename($url);
sendfile($url,$filename,$size);
?>
// variables initiales
$maxdown=30; // Nombre de téléchargements autorisés par jour et par IP
$volmaxperday=8000*1024*1024; // Volume maximal par jour (8Mo)
$id = $_GET["id"]; // id du fichier
$ip=getenv("REMOTE_ADDR"); // IP du visiteur
$ua=$_SERVER["HTTP_USER_AGENT"]; // Juste pour des stats (peut être utilisé pour bloquer les robots)
// Evite que les accélérateur de downloads démarrent 5 téléchargements d'un coup...
srand ((double) microtime() * 1000000);
$randnum = rand(1,3);
sleep($randnum);
// Suppression des stats de plus d'un jour
$resquota=mysql_query("DELETE FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY) < now()");
// Récupération de l'url du fichier
$res = mysql_query("SELECT url FROM files WHERE id=$id");
if (!(list($url) = mysql_fetch_row($res))) {exit;}
// Récupération de la taille du fichier
$size=filesize($url);
// Test sur le quota journalier de l'IP
$resquota = mysql_query("SELECT COUNT(*) AS compte FROM downloads WHERE ((DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()) AND (ip='$ip'))");
list($ipcount)=mysql_fetch_row($resquota);
if ($ipcount>=$maxdown) die("Quota de l'IP dépassé");
// Test sur le quota journalier
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>$volmaxperday) die("Quota journalier dépassé");
// Test sur le quota par 15'
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 15 MINUTE) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>($volmaxperday/24/4)) die("Quota du 1/4h dépassé");
$sql_quota = "INSERT INTO downloads (ip,ref,datedownload,taille,useragent) VALUES ('$ip',$id,now(),$size,'$ua')";
$res_quota = mysql_query($sql_quota);
$filename = basename($url);
sendfile($url,$filename,$size);
?>
La fonctionn sendfile() est détaillée sur la page Forcer le téléchargement d'un fichier