Criar arquivo temporário e removido automaticamente

Estou escrevendo um script de download anti-leeching, e meu plano é criar um arquivo temporário, que é nomeado por ID da session e, depois da expiração da session, o arquivo será excluído automaticamente. É possível ? E você pode me dar algumas dicas sobre como fazer isso no PHP?

Muito obrigado por qualquer resposta

    Então, temos um ou mais arquivos disponíveis para download. Criar um arquivo temporário para cada solicitação de download não é uma boa idéia. Criar um symlink() para cada arquivo é uma idéia muito melhor. Isso economizará muito espaço em disco e manterá a carga do servidor.

    Nomear o link simbólico após a session do usuário é uma idéia decente. Uma idéia melhor é gerar um nome de simbolo random e associar com a session, de modo que o script pode lidar com vários downloads por session. Você pode usar session_set_save_handler() ( link ) e registrar uma function de read personalizada que verifica as sessões caducadas e remove os links simbólicos quando a session expirou.

    PHP tem uma function para esse nome tmpfile . Ele cria um arquivo temporário e retorna um recurso. O recurso pode ser usado como qualquer outro recurso.

    Por exemplo, o exemplo do manual:

     < ?php $temp = tmpfile(); fwrite($temp, "writing to tempfile"); fseek($temp, 0); echo fread($temp, 1024); fclose($temp); // this removes the file ?> 

    O arquivo é automaticamente removido quando fechado (usando fclose ()) ou quando o script termina. Você pode usar qualquer function de arquivo no recurso. Você pode encontrar estes aqui . Espero que isso ajude você?

    Outra solução seria criar o arquivo da maneira regular e usar um cronjob para verificar regularmente se uma session expirou. A data de validade e outros dados da session podem ser armazenados em um database. Use o script para consultar esses dados e determine se uma session expirou. Se assim for, remova-o fisicamente do disco. Certifique-se de executar o script uma vez por hora ou mais (dependendo do tempo limite).

    Você poderia explicar seu problema um pouco mais profundamente? Porque não vejo uma razão para não usar $_SESSION . Os dados em $_SESSION são armazenados no lado do servidor em um arquivo (consulte http://php.net/session.save-path ) BTW. Pelo menos, por padrão. 😉

    Sugiro que você não copie o arquivo em primeiro lugar. Eu faria o seguinte: quando o usuário solicita o arquivo, você gera uma seqüência única aleatória para dar-lhe o link desta maneira: dl.php?k=hd8DcjCjdCkk123 então coloque essa string em um database, armazene seu endereço IP, talvez session e o tempo que você gerou o link. Em seguida, outro usuário solicita esse arquivo, certifique-se de que todas as coisas (hash, ip e assim por diante) coincidem e o link não expirou (por exemplo, não mais que N horas se passaram desde a geração) e se tudo estiver OK, use PHP para pipe o arquivo. Defina um trabalho cron para procurar o database e remover as inputs expiradas. O que você acha?

    tmpfile

    Cria um arquivo temporário com um nome exclusivo no modo de leitura-gravação (w +) e retorna um identificador de arquivo. O arquivo é automaticamente removido quando fechado (usando fclose ()) ou quando o script termina.

    Ok, então temos os seguintes requisitos até agora

    1. Deixe o usuário baixar apenas em sua session
    2. Não copie e cole o link para outra pessoa
    3. Os usuários devem fazer o download do site, por exemplo, não há hotlinking
    4. Velocidade de controle

    Vamos ver. Isso não está funcionando código , mas deve funcionar de acordo com estas linhas:

     < ?php // download.php session_start(); // start or resume a session // always sanitize user input $fileId = filter_input(INPUT_GET, 'fileId', FILTER_SANITIZE_NUMBER_INT); $token = filter_input(INPUT_GET, 'token', FILTER_UNSAFE_RAW); $referer = filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_URL); $script = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL); // mush session_id and fileId into an access token $secret = 'i can haz salt?'; $expectedToken = md5($secret . session_id() . $fileId); // check if request came from download.php and has the valid access token if(($expectedToken === $token) && ($referer === $script)) { $file = realpath('path/to/files/' . $fileId . '.zip'); if(is_readable($file)) { session_destroy(); // optional header(/* stuff */); fpassthru($file); exit; } } // if no file was sent, send the page with the download link. ?> 
    		      	

    Talvez seja tarde para responder, mas eu estou tentando compartilhar no googlize de resources!

    Se você usa o CPanel, há uma maneira curta e rápida de bloquear o pedido externo em seus arquivos hospedados cujo nome é: HotLink .

    você pode ativar o HotLinks em você, e certifique-se de que ninguém pode solicitar o seu arquivo de outra hospedagem ou usar seus arquivos como referência de download.

    Para conseguir isso, eu faria um arquivo e protegê-lo usando chmod – tornando-o indisponível para o público. Ou, alternativamente, salve o conteúdo em uma linha de tabela do database, procure-o sempre que necessário.

    Fazendo o download como um arquivo. Para fazer isso, eu obteria o conteúdo do arquivo protegido, ou se ele estiver armazenado em uma tabela de database, buscá-lo e simplesmente emiti-lo. Usando headers php, gostaria de dar um nome desejado, extensão, especificar seu tipo e, finalmente, forçar o navegador a baixar o resultado como um arquivo sólido.

    Desta forma, você só precisa salvar dados em um local, em um arquivo protegido ou em database. Força o navegador do cliente para baixá-lo tantas vezes como as condições se encontram, por exemplo, desde que o usuário esteja logado e assim por diante. Sem ter que se preocupar com o espaço em disco, fazer qualquer arquivo temporário, cronJobs e / ou eliminação automática do arquivo.