Kaldırılır geçici dosya ve otomatik Oluştur

6 Cevap php

Ben bir anti-kurmaya indir komut dosyası yazıyorum ve benim planı seans bitiminden sonra, dosya otomatik olarak silinecektir, oturum kimliği tarafından adlı bir geçici dosya oluşturmak için. Bu mümkün mü? Ve bana PHP bunu nasıl bazı ipuçları verebilir?

Çok herhangi bir cevap için teşekkürler

6 Cevap

Bu yüzden indirmek için mevcut bir veya daha fazla dosya var. Her indirme istekleri için bir geçici dosya oluşturma iyi bir fikir değildir. Her dosya için bir symlink() oluşturmak yerine çok daha iyi bir fikir. Bu disk alanı yükler kaydedin ve sunucu yükünü aşağı devam edecektir.

Kullanıcının seanstan sonra sembolik bağ adlandırma iyi bir fikirdir. Daha iyi bir fikir rasgele bir sembolik isim oluşturmak için & oturumu ile ilişkilendirmek, bu yüzden komut oturum başına birden fazla indirme işleyebilir. Sen session_set_save_handler() (link) kullanımı ve süresi dolmuş oturumları için denetler ve oturumu sona erdiğinde sembolik kaldıran özel bir read function kayıt olabilirsiniz.

PHP bu adı için bir işlevi vardır tmpfile. Bu geçici bir dosya oluşturur ve bir kaynak verir. Kaynak başka bir kaynak gibi kullanılabilir.

Örneğin kılavuzundan örnek:

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

Dosya otomatik olarak () (fclose kullanarak) kapatıldığında kaldırıldı, ya da script sona erdiği edilir. Sen kaynak üzerinde herhangi bir dosya işlevlerini kullanabilirsiniz. Bu here bulabilirsiniz. Bu size yardımcı olacağını umuyoruz?

Başka bir çözüm düzenli şekilde dosyası oluşturun ve bir oturum süresi ise düzenli check bir cronjob kullanmak olacaktır. Son kullanma tarihi ve diğer oturum verileri bir veritabanında saklanabilir. Bu verileri sorgulamak ve bir oturum süresi dolmuş olup olmadığını belirlemek için komut dosyasını kullanın. Eğer öyleyse, diskten fiziksel çıkarın. (Senin zaman aşımı bağlı olarak) bir kez bir saat ya da öylesine komut dosyasını çalıştırmak için emin olun.

Eğer biraz daha derinden sorunu açıklayabilir misiniz? Ben kullanmak için neden bir neden görmüyorum, çünkü $_SESSION. Veriler, $_SESSION BTW (bakınız http://php.net/session.save-path) bir dosyaya sunucu tarafı depolanır. En azından varsayılan. ;-)

Ben ilk etapta dosyayı kopyalamak için değil size öneririm. Ben aşağıdakileri yapardım: kullanıcı dosyayı istediğinde, ona bu şekilde link vermek için rasgele benzersiz bir dize oluşturmak: dl.php?k=hd8DcjCjdCkk123 sonra da IP adresini, belki oturumu depolanması, bir veritabanı için bu dize koymak ve Eğer bağlantıyı elde ettik zamanı. Sonra dosya başka bir kullanıcı isteği, tüm malzeme (hash, ip ve benzeri) maçları ve emin bağlantı süresi (N saat nesil geçti ki, örneğin daha fazla değil) ve herşey yolunda ise, boru PHP kullanmak değil dosyası. DB üzerinden bakmak ve süresi dolan girdileri kaldırmak için bir cron işi ayarlayın. Sen ne düşünüyorsun?

tmpfile

Creates a temporary file with a unique name in read-write (w+) mode and returns a file handle. The file is automatically removed when closed (using fclose()), or when the script ends.

Tamam, bu yüzden bugüne kadar aşağıdaki şartları var

  1. Let onun / oturumunda kullanıcı indir tek
  2. hiçbir kopya & başkası için linki yapıştırın
  3. Kullanıcılar, siteye, örneğin indirmek zorunda Hiçbir hotlinking
  4. Hız kontrolü

Bakalım. Bu not working code, ama bu satırlar boyunca çalışması gerekir:

<?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.
?>
<html ...

<?php printf('a href="/download.php?fileId=%s&amp;token=%s', 
              $fileId, $expectedToken); ?>

...
</html>

Ve işte bu. Veritabanı gerekmez. Bu gereksinimleri 1-3 kapsamalıdır. PHP ile hız kontrol edemez, ancak oturumu yok dont bir dosya göndererek sonra oturuma bir sayaç yazmak ve kullanıcı oturumu sırasında gönderilecek dosya sayısını sınırlayabilir.

Ben bütün kalbiyle bu çok daha zarif bu monkeyform ile kesmek daha çözülebilir olduğunu kabul ediyorum, ama kanıt-of-concept gibi, bu yeterli olmalı.

Belki de cevap için geç için ama ben özellik googlize paylaşmak için deneyin!

if you use CPanel there is a short and quick way for blocking external request on your hosted files which name is: HotLink.

Eğer Cpanel üzerinde Hotlinks etkinleştirin ve olmayacak kimsenin başka bir hosting dosyanızın o isteği var ya bir indirme referans olarak dosyalarınızı kullanabilirsiniz.