Ограничить сумму, которую пользователь загружает с веб-сайта, и перенаправить при достижении лимита? - PullRequest
2 голосов
/ 07 декабря 2011

Извините за расплывчатое название! У меня есть веб-сайт с большим количеством PDF-файлов и ограниченным ежемесячным обменом. Я хотел бы добиться (в PHP) способа ограничить каждого пользователя ($_SESSION?) Определенным пределом - скажем, 50 МБ, и после этого, когда они щелкают, чтобы загрузить другой файл, они будут перенаправлены на веб-страницу, запрещающую дальнейшие загрузки (скажем, в течение следующих 24 часов).

Возможно ли это? Я не уверен, что мой счетчик загрузок может рассчитывать только .pdf файлов (я не хочу, чтобы висторы были заблокированы от просмотра сайта, если они достигнут предела). Любой код псевдо будет принята с благодарностью.

Ответы [ 5 ]

4 голосов
/ 07 декабря 2011

Если у вас все ваши загрузки проходят через один скрипт php:

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

Вы можете делать практически все, что захотите. Этот php-файл может доставить все ваши файлы (не допуская их попадания в webroot), записать их в _SESSION и может выполнить ваше перенаправление. Наслаждайтесь.

2 голосов
/ 07 декабря 2011

Если у вас уже есть пользовательская система, я бы рекомендовал хранить всю информацию в профиле пользователя.

Так что нет проблем, если он удалит все свои куки и повторные логины!

А для гостей, я бы порекомендовал ограничения по капчам и сессиям или по 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 голосов
/ 23 ноября 2013

Создать таблицу для хранения количества загрузок

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

}



?>
0 голосов
/ 07 декабря 2011

Я думаю, что вы пытаетесь избежать принуждения пользователя к регистрации на вашем сайте, в то время как вы пытаетесь отслеживать пропускную способность на каждого посетителя с непрактичными обычными способами (куки, 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

Примечание: Каждый раз, когда пользователь загружает файл, вы обновляете строку Bandwidth для нужного пользователя, чтобы позже вы могли проверить, достигает ли конкретный пользователь своего предела или нет. Вы также должны сбросить его после каждых 24 часов.

Это общее решение, и многие считают, что необходимо проверять, например, пропускная способность счетчика должна сбрасываться каждые 24 часа.

0 голосов
/ 07 декабря 2011

Я бы, вероятно, держался подальше от сессий для этого. Сессии нестабильны и подвержены различному поведению браузера. Например, в Firefox, если сеанс инициализирован, я могу закрыть Firefox, посетить тот же сайт, и сессия все еще активна. Однако в IE, если я открываю несколько вкладок и посещаю один и тот же сайт, каждый экземпляр с вкладками получает новый идентификатор сеанса.

Я бы рекомендовал настроить систему учетных записей, в которой пользователь должен войти на ваш сайт. Затем вы можете отслеживать их количество загрузок на уровне учетной записи, которое будет сохраняться между несколькими сеансами.

...