2011-12-07 3 views
2

Désolé pour le vague, le titre! J'ai un site Web avec beaucoup de fichiers PDF et une bande passante mensuelle limitée. Qu'est-ce que je voudrais réaliser (en PHP) est une façon de limiter chaque utilisateur ($_SESSION?) À une certaine limite - disons 50MB, et au-delà quand ils ont cliqué pour télécharger un autre fichier, ils seraient redirigés vers une page Web refusant tout téléchargement (pour les prochaines 24 heures, disons).Limiter le montant qu'un utilisateur télécharge à partir d'un site Web et rediriger lorsque la limite est atteinte?

Est-ce possible? Je ne suis pas sûr si mon "compteur" de téléchargement ne peut compter que .pdf fichiers (je ne veux pas que les visiteurs soient bloqués de la navigation sur le site s'ils atteignent la limite). N'importe quel code de pseudo serait grandement apprécié.

Répondre

4

Si vous avez tous vos téléchargements passent par un seul script php:

<a href="download.php?file='filename.pdf'" /> 

Vous pouvez faire à peu près tout ce que vous voulez. Ce fichier php peut fournir tous vos fichiers (en les gardant hors du webroot), écrire sur votre _SESSION, et il peut effectuer votre redirection. Prendre plaisir.

0

Je resterais probablement loin des sessions pour cela. Les sessions sont volatiles et sensibles aux divers comportements du navigateur. Par exemple, dans Firefox si une session est initialisée, je peux fermer Firefox, visiter le même site, et la session est toujours active. Cependant, dans IE si j'ouvre plusieurs onglets et que je visite le même site, chaque instance à onglets obtient un nouvel identifiant de session.

Je vous recommande de configurer un système de compte dans lequel un utilisateur doit se connecter à votre site. Ensuite, vous pouvez suivre leur montant de téléchargement au niveau du compte, qui va persister entre plusieurs sessions.

2

Si vous avez déjà un système utilisateur, je recommande de stocker toutes les informations dans le profil de l'utilisateur.

Il n'y a donc aucun problème s'il supprime tous ses cookies et relogins!

Et pour les invités, je recommanderais des captchas et des restrictions de session ou IP.

// Pseudo code 
// download.php 

function UserHasReachedLimit($file) 
{ 
    $info = $Database->QueryUserInfo('limit'); 
    $max = $Database->GetLimitForFile($file); 

    if ($info[$file] > $max) 
    return false; 
    else 
    return true; 
} 

if (IsUser()) 
{ 
    if (UserHasReachedLimit()) 
    error(); 
    else 
    download(); 
} 
else // guest 
{ 
    // session or IP based restrictions... 
} 
+0

Merci pour les réponses. Je n'ai pas un système d'utilisateur et il semble un peu au-delà de la portée/taille du site, je vais le garder à l'esprit cependant. Je suppose que cela laisse des restrictions SESSION/IP (malgré les avertissements de Digital Precision). En termes de code de psuedo, quelqu'un pourrait-il me donner une idée? Im penser download.php? File = 'foo.pdf' download.php vérifie IP, reprend SESSION, obtient la taille du fichier compare à la limite et permet/refuse le téléchargement. Mais comment puis-je effacer la SESSION après une journée? Le reste est-il sensé? – rwb

0

Je pense que vous essayez d'éviter de forcer l'utilisateur à enregistrer dans votre site, alors que vous essayez de suivre la bande passante par des visiteurs avec est peu pratique avec les moyens communs (cookies, ip ...). Donc, la meilleure façon (à mon avis, bien sûr il y a beaucoup de solutions améliorées) est de faire un simple formulaire d'inscription, nom, mot de passe et email, mettre un système d'activation par mail pour protéger votre site d'utilisateur, maintenant chaque utilisateur connecté et essayé de télécharger un fichier, vous traitez sa demande dans les étapes suivantes:

1) demande d'utilisateur pour le nom de fichier.pdf (vérifiez sa disponibilité et la taille (important)).

2) vérifier la bande passante de l'utilisateur:

$query = sql_query("SELECT Bandwidth, LastDownload FROM Users, Stats WHERE USER_ID=5"); 
$result = sql_fetch($query); 
if ($result['Bandwidth'] < 50M) 
showDownloadLink(); 
else if($result['LastDownload'] - currentTime() !=0) 
echo "please wait to the next 24h"; 

Database devrait ressembler à ceci: utilisateurs:

ID_U int(key, auto increment), Name varchar(25), email varchar(255), password varchar(32), Bandwith float 

Stats:

ID_S int(key, auto increment), LastDownload time, ID_U integer 

Note: Chaque utilisateur de temps télécharger un fichier , vous mettez à jour la ligne de bande passante pour le bon utilisateur, donc plus tard, vous pouvez vérifier si un utilisateur particulier atteint sa limite ou non. Vous devez également le réinitialiser après chaque 24H.

Il s'agit d'une solution générique dont beaucoup pensent qu'elle doit être vérifiée, comme la bande passante du compteur doit être réinitialisée toutes les 24H.

0

Créer une table pour stocker le nombre de téléchargements

CREATE TABLE IF NOT EXISTS `downloaded` (
    `ip` varchar(200) NOT NULL, 
    `count` int(11) NOT NULL DEFAULT '0', 
    `last_access` datetime DEFAULT NULL, 
    UNIQUE KEY `ip` (`ip`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

<?php 

/* 
$limit => Number of Downloads Allowed 
$period => In minutes 

*/ 
function UserHasReachedLimit($limit, $period) { 
$ip = addslashes($_SERVER['REMOTE_ADDR']); 
$dl = false; 
$sql = sprintf("SELECT UNIX_TIMESTAMP(last_access) last_time, count FROM downloaded WHERE ip = '%s' ORDER BY last_access DESC", $ip); 
$res = mysql_query($sql); 

if (mysql_num_rows($res) > 0) { // There is a registered IP already 
    $last_xs = mysql_result($res, 0, 'last_time'); 
    $last_xs += $last_xs+$period * 60; 
    $count = mysql_result($res, 0, 'count'); // number of downloads by this ip 
    if ($count == $limit && $last_xs > time()) { // we check if downloads reached in this period 
    $dl = true; 
    } else { 
    $sql = sprintf("UPDATE downloaded SET count = CASE WHEN count >= %s THEN 0 ELSE count+1 END, last_access=now() WHERE ip ='%s'", $limit+1, $ip); // we just update download count + 1 
    mysql_query($sql); 
    } 
    } else { // There is not a registered IP and we create it 
    $sql = sprintf("INSERT INTO downloaded VALUES ('%s', '0', NOW());", $ip); mysql_query($sql); 
    } 
return $dl; 
} 


/* 
Usage 
*/ 
$limit = 2; 
$period = 2; 
if(UserHasReachedLimit($limit, $period) == true) { 
// User reached number of 2 downloads in 2 minutes 

} else { 
// Continue downloading 

} 



?> 
Questions connexes