Ir para conteúdo
Fórum Script Brasil
  • 0

Download Mediante Login


Beraldo

Pergunta

Olá, pessoal! :D

Vejo várias vezes usuários querendo saber como liberar o download de um arquivo somente se o usuário efetuar login. Se você simplesmente colocar o arquivo no servidor e fazer o link para download da forma abixo, qualquer pessoa poderá inserir a URL no navegador e baixar o arquivo sem efetuar login:

<a href="arquivo.zip">Download</a>
Por isso é necessário fazer uma verificação antes de liberar o download. Para isso, utilizaremos sessões. Com este sistema, não é necessário compactar os arquivos para disponibilizá-los. Mesmo que sejam imagens ou outros tipo que possam ser executados no próprio navegador, o download deverá ser realizado. Começando com o código SQL da nossa tabela:
Create Table usuarios(
id smallint(5) Unsigned Not Null auto_increment,
login varchar(30) Not Null,
senha char(32) Not Null,
Primary Key (id),
Unique Key (login)
)type = innodb Character Set latin1 Collate latin1_general_ci;
Agora inserimos um usuário na tabela:
Insert Into usuarios Values (NULL, "Beraldo", MD5(123));
No topo de nossa index.php teremos este código:
<?php
session_start();

require "_arquivos.php";// script que realiza todos os requires necessários

//nomes dos arquivos disponíveis para download. A chave do array é o ID utilizado para baixar o arquivo
$arquivos[0] = "Cristina_Scabbia.jpg";
$arquivos[1] = "LadyAngellyca.jpg";
$arquivos[2] = "SimoneSimons_01.jpg";
$arquivos[3] = "SimoneSimons_02.jpg";

$_SESSION['arquivos'] = $arquivos;// colocamos na sessão para acessar o array por meio do script download.php 

?>
Primeiro iniciamos a sessão. Depois requeremos o arquivo "_arquivos.php", que inclui automaticamente todas as classes e funções utilizadas. Esse arquivo será detalhado mais a frente. O array $arquivos contém os nomes dos arquivos disponíveis para download. Colocamos esse array na sessão para que ele possa ser acessado pelo script download.php. No corpo da index.php (body) colocaremos este código:
<?php

if (!isset ($_SESSION['login']))//se o usuário não estiver logado
{
    //será exibido o formulário para login
    echo "
    <form method=\"post\" action=\"login.php\">
    Login:<br />
    <input type=\"text\" name=\"login\" />
    <br /><br />
    Senha:<br />
    <input type=\"password\" name=\"senha\" />
    <br /><br />
    <input type=\"submit\" value=\"Entrar\" />
    </form>
    ";
}
else//caso contrário (usuário logado)
{
    $auth = isset ($_SESSION['login']['auth']) ? $_SESSION['login']['auth'] : 0;// variável que verifica a autenticidade da sessão
    
    if ($auth == md5(1))//se estiver corretamente logado
    {
        echo "
        <p>Olá, <strong>" . $_SESSION['login']['username'] . "</strong>.</p>
        <p>Escolha um arquivo para baixar.</p>
        <p><a href=\"sair.php\">Sair</a></p>
        ";
    }
}


/*
   Esta parte exibe os arquivos disponíveis para download (cadastrados no array $arquivos). 
   Note que se você clicar nesses links sem efetuar login, o download não é realizado. 
*/

echo "<p>Arquivos disponíveis para download:</p>";

for ($d = 0; $d < count ($arquivos); $d++)
{
    echo "<p style=\"margin: 2px 0 0 1px;\"><a href=\"download.php?id=" . $d . "\">" . $arquivos[$d] . "</a></p>\r\n";
}
?> 
Não vou postar o arquivo de login nem a classe destinada a isso, pois colocarei o link para download do sistema completo no fim do artigo. Além disso, esse não é o assunto central do artigo, e estou considerando que quem está lendo este tutorial sabe como criar um sistema de login. O início do arquivo download.php tem este código:
<?php
session_start();

$id = isset ($_GET['id']) ? (int)$_GET['id'] : NULL;//id do arquivo selecionado
$arqs = $_SESSION['arquivos'];//o array de arquivos, definido na index.php
$dir = "arquivos/";// diretório dos arquivos para download
?>
Vale lembrar que o id dos arquivos são as chaves (índices) do array $arquivos. Continuando o arquivo download.php:
<?php
if (isset ($_SESSION['login']))//se o usuário estiver logado
{
    if ($_SESSION['login']['auth'] == md5 (1))//se o usuário estiver corretamente logado
    {
        if (file_exists ($dir . $arqs[$id]))// se existir o arquivo requerido
        {
            $arquivo = $dir . $arqs[$id];//caminho completo ao arquivo
            $tamanho = filesize ($arquivo);//tamanho do arquivo
        
            header("Content-Type: application/save");/* faz com que seja salvo o arquivo, independentemente se ele for imagem ou outros tipos que possam ser executados pelo navegador */
            header("Content-Length: ".$tamanho);// envia o tamanho do arquivo para o navegador
            header("Content-Disposition: attachment; filename=" . $arqs[$id]);/* Coloquei $arqs[$id] em vez de $arquivo para que o nome do arquivo mostrado ao usuário não seja o caminho completo a ele */
            header("Content-Transfer-Encoding: binary");//codificação
            readfile($arquivo);// lê o arquivo requerido
        }
        else//se o arquivo não existir
        {
            die ("Arquivo não encontrado");
        }
    }
}
else//se o usuário não estiver logado
{
    echo "
    <script type=\"text/javascript\">
    alert ('Antes de fazer o download, efetue o login.');
    location.href = 'index.php';
    </script>
    ";
    exit;
}
?>

Essa é a idéia central, mas é possível colocar os nomes dos arquivos em um banco de dados, criar níveis de acesso, etc. Enfim, é possível criar muitas coisas a partir dessa idéia.

Disponibilizei o arquivo completo para download aqui mesmo na SB no link abaixo.

https://www.scriptbrasil.com.br/?class=2.3&...ria=Seguran%E7a

Quem baixar o arquivo deverá rodá-lo no PHP 5.x ou superior (ainda não criado até a data deste tutorial - 17/02/2007) e MySQL 4.1.x ou superior.

Abraços.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Com esse mesmo princípio da para fazer uma área restrita?? TIpo, se o usuário for um Administrador, entãoa aárea X é liberada para ele??

A lógica é semelhante: você deverá criar níveis de acesso. Cada nível pode ser representado por um número, que deve ser salvo numa variável da sessão. No início de cada parte do site (administrativa, por exemplo), você verifica se o nível do usuário permite acesso àquela área. ;)

Abraços,

Beraldo

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...