繁体   English   中英

限制用户从网站上下载的数量,并在达到限制时重定向?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM