[英]Limt the amount a user downloads from a website, and redirect when limit is reached?
抱歉,标题含糊! 我的网站上有很多PDF文件,并且每月带宽有限。 我要实现的目标(用PHP)是一种将每个用户( $_SESSION
?)限制为一定的限制的方法-例如50MB,此外,当他们单击下载另一个文件时,他们将被重定向到一个拒绝进一步访问的网页。下载(例如接下来的24小时)。
这可能吗? 我不确定我的下载“计数器”是否只能计数.pdf
文件(我不希望访问者在达到限制时被阻止浏览该网站)。 任何伪代码将不胜感激。
如果您所有下载都通过一个php脚本进行:
<a href="download.php?file='filename.pdf'" />
您几乎可以做任何您想做的事。 该php文件可以传送您的所有文件(将其保留在webroot之外),写入到_SESSION,然后可以执行重定向。 请享用。
如果您已经有一个用户系统,建议您将所有信息存储在用户配置文件中。
因此,如果他删除所有cookie并重新登录就没有问题!
对于来宾,我建议您使用验证码和基于会话或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...
}
创建一个表来存储计数下载
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
}
?>
为此,我可能会远离会议。 会话易变,容易受到各种浏览器行为的影响。 例如,在Firefox中,如果初始化了会话,则可以关闭Firefox,访问同一站点,并且会话仍处于活动状态。 但是在IE中,如果我打开多个选项卡并访问同一站点,则每个选项卡式实例都会获得一个新的会话ID。
我建议设置一个帐户系统,用户必须登录到您的网站。 然后,您可以在帐户级别跟踪其下载量,该下载量将在多个会话之间持续存在。
我认为您尝试避免强制用户在您的站点中注册,而您尝试跟踪每个访问者的带宽对于常规方式(cookies,ip ...)来说是不切实际的。 因此,最好的方法(我认为当然有很多改进的解决方案)是制作一个简单的注册表格,说出姓名,密码和电子邮件,为每个电子邮件放置一个激活系统以保护您的网站不受用户的侵害,现在每个用户登录并尝试下载文件,您可以按照以下步骤处理他的请求:
1)用户要求提供文件名.pdf(检查其可用性和大小(重要))。
2)检查用户带宽:
$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";
数据库应该是这样的:用户:
ID_U int(key, auto increment), Name varchar(25), email varchar(255), password varchar(32), Bandwith float
统计:
ID_S int(key, auto increment), LastDownload time, ID_U integer
注意:每次用户下载文件时,都会为合适的用户更新“带宽”行,因此以后您可以检查特定用户是否达到其限制。 您还必须在每24小时后重置一次。
这是一个通用的解决方案,许多人认为必须进行检查,例如计数器带宽必须每24H重置一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.