Limitando o número de downloads por cliente / pessoa / usuário / IP

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Prefácio

Rapidshare, MegaUpload, EasyShare, Zupload, Uploading, 4Shared… Quem nunca usou nenhum destes serviços que atire a primeira pedra. Não é tão intrigante o modo como eles conseguem fazer com que baixemos apenas um arquivo por vez? É muito bom saber que você consegue poupar uma porção de banda limitando o número de downloads cabeça!
Esta solução também provê um fim para o download utilizando aceleradores! :)

Os mais puristas irão indicar o módulo mod_limitipconn do Apache, mas se você estiver em uma hospedagem compartilhada, na maioria das vezes você não poderá mexer nos módulos do Apache.

Nessa dica iremos utilizar o mod_rewrite e um scriptzinho que irá gerenciar os downloads. Este também poderá ser adaptado para funcionar da mesma forma que o script gerenciador de downloads que foi desenvolvido em um dos últimos artigos, Forçar download ao invés da exibição.

Quem irá cuidar dos acessos de cada usuário será o nosso bom e velho MySQL (claro que você pode adaptar para PostgreSQL, Oracle, MS SQL Server, etc).

Mão na massa

A primeira coisa de todas é criar a nossa querida tabela. Vamos dar à ela o nome de baixando.

[sql]CREATE TABLE `baixando` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`arquivo` VARCHAR(255) NOT NULL,
`ip` CHAR(15) NOT NULL,
`ultimoacesso` DATETIME NOT NULL,
) ENGINE=InnoDB[/sql]

Agora precisamos do arquivo .htaccess. Caso você ainda não o conheça, você pode ler mais sobre ele neste artigo: Sobrescrevendo as configurações do php.ini com Apache e .htaccess.

Bom… Vamos supor que todos os arquivos estejam dentor da pasta arquivos. Você irá salvar o arquivo .htaccess neste diretório contendo as seguintes linhas:

[sourcecode]RewriteEngine on
RewriteRule (.*)(zip|rar|pdf|exe)$ /arquivos/baixar.php [QSA][/sourcecode]

Esta regra irá capturar todos os arquivos que forem acessados neste diretório, terminados em (zip|rar|pdf|exe), e irá cuidar para que todos eles sejam redirecionados para o arquivo baixar.php. É neste arquivo que devemos fazer a configuração para verificar se o fulano que está acessando tem permissão para tal.

E vamos à parte que estamos “acostumados”:

[php][/php]

Neste exemplo é utilizado um intervalo de 1800 segundos (meia hora) antes que o usuário possa baixar este arquivo novamente. Se o valor de $baixando for true.

E então segue o código que irá gerenciar o download! :)

[php]503 Service Unavailable

Você já baixou este arquivo demais!

‘;
exit;
}
?>[/php]

Com este código, o download só será possível se já tiver passado meia hora após a última vez em que este IP efetuou o download. E daí é só correr pro abraço! :P

Conclusão

Não é difícil de montar um sistema assim. Como em todos os tutoriais aqui, você pode desenvolver novas implementações e aumentar o potencial do script. Caso você utilize estes scripts como base ou caso você encontre algum erro, adoraria receber um comentário ou um e-mail seu!

Um grande abraço e fiquem com Deus.