Bir dosyayı yüklemek için en güvenli yöntem nedir?

3 Cevap php

Çalıştığım şirket son zamanlarda biz ev sahipliği sitelerde birçok başlık enjeksiyon ve dosya upload açıkları ile vuruldu ve biz enjeksiyon saldırıları header ile ilgili sorunu sabit varken, biz kontrol altında yükleme patlatır almak için henüz.

Ben bir tasarımcı, sitenin yapısına kopyalamak birkaç değişkenleri değiştirmek, ve hazır-to-go yükleme oluşmaya olabilir içi kullanmak için yükleme komut bir tak-ve-çalıştır tipi dizi kurmak için çalışıyorum onların site. Biz mümkün olduğunca bizim maruz (biz zaten fopen ve kabuk komutları kapattılar) sınırlamak için arıyoruz.

Ben son saat sitesi aradı ve dış kaynaklarına güvenmek özel yöntemler ile ilgili pek çok farklı cevaplar buldum. Tüm koruma güvenilir bir yöntem olarak kullanmak için yeterince özgü iyi senaryo-tek çözüm sizce nedir? Ayrıca, mümkünse PHP veya pseudo-kod sınırlı dilini tutmak istiyorum.

Bu kabuk komut exec (yararlanıyor iken Edit: Ben, (bu çözüm çok iyi yapar) Yüklediğiniz olmaktan komut dosyaları blok halinde), cevabı buldum (aşağıda yayınlanmıştır) ve ettik herhangi bir sorun olmaz.

3 Cevap

En iyi çözüm, IMHO, "web" ortamı dışında yüklenen dosyaları içeren dizini koymak ve onları indirilebilir yapmak için bir komut dosyası kullanmaktır. Bu şekilde, birileri bir komut dosyası yükler olsa bile tarayıcıdan çağırarak idam edilemez ve yüklenen dosya türünü kontrol etmek zorunda değilsiniz.

Kullanın ve Hardened-PHP move_uploaded_file ve $_FILES superglobal kullanarak düz bir komut dosyası oluşturmak yapılandırın. Basit komut, o olacak güvenli (en azından çalışan PHP versiyonu kendisi gibi güvenli)

Çok ve çok (... ve lots) araştırma sonra, ben yükleme doğrulama en geçerli yöntem buldum inanıyorum. Yöntem, onun dezavantajları var ama ortalama tasarımcısı - ben senaryoyu tasarımı kim - bu harika çalışıyor:

$filename = time() . '_' . $_FILES[$upload_label]['name'];
$tmp_name = $_FILES[$upload_label]['tmp_name'];

$extension = strtolower(substr(strrchr($filename, '.'), 1));

// A list of accepted filetypes ordered by extension and info pertinent returned from the server
$accepted_files = array(
    'jpg' => 'JPEG', 
    'gif' => 'GIF', 
    'png' => 'PNG', 
    'pdf' => 'PDF'
);

// Ask the server for info on the file
$info = exec("file " . escapeshellarg($tmp_name));

// Distill the info down to a usable string
$info = array_shift(explode(' ', substr($info, strpos($info, ' ') + 1)));

// Compare the returned info to a pre-defined list of allowed types
if ($info == $accepted_files[$extension]) {

    // Passed verification
    if (move_uploaded_file($tmp_name, "$upload_folder$filename")) {
        // Success
        chmod("$upload_folder$filename", 0755);
    } else {
    	// Failure
    }
}

Sakıncaları herhangi bir php komut dosyaları (exec beri () oyunda) yüklenebilir ve bu yöntem sadece Apache ya da 'file' gibi komutuyla başka bir sunucuda kullanılabilir izin veremeyiz vardır. Bunun dışında, bu harika çalışıyor