php yüklenenler üzerine mim Faking önlemek

4 Cevap php

Bir dosya upload bir mim türü taklit ve daha sonra bir php / exe / etc çalışan birisi önlemek için bir yolu var mı ...

Ben dosyaları saklanabilir, böylece dosya yükleme dizini yazılabilir ve çalıştırılabilir yapmak zorunda, ama bu herkes sonra bir komut dosyası çalıştırmak için izin verir. Yapabileceğim tek şey, (onlar hala bir listesini almak için dizinden okuyamaz beri) sonra dosya adını tahmin edemez bu yüzden dosya adı rasgele verileri ekleyin.

Ben ilk defa php ile dosya upload kullanıyorum ve güvenlik konularında tüm karşılamak için çalışıyorum.

4 Cevap

Dosya yükleme dizini web tarayıcısı için erişilebilir olmamalıdır. Yani Biri bir dosya yüklemek için izin vermez, "remove_all_my_files.php" demek, ve sonra ona url vererek sisteminizde çalıştırmak demek, "http://xample.com/uploads/remove_all_my_files.php".

Dosyayı doğrudan hizmet etmeyin. Bir kamu erişim konumda hiçbir in yüklenenler tutun. Dosyadan okumak indirmeden izin çıkışı için tampon.

Burada temel fikir:

function ReadAndOutputFileChunked ($filename) { 
	$chunksize = 1*(1024*1024); // how many bytes per chunk 
	$buffer = ''; 
	$handle = @fopen($filename, 'rb'); 
	if ($handle === false) { 
		return false; 
	} 
	while (!feof($handle)) { 
		$buffer = @fread($handle, $chunksize); 
		print $buffer; 
	} 
	return @fclose($handle); 
}

header("Content-type: application/octet-stream");
ReadAndOutputFileChunked('/private/path/to/upload/files/' . $nameOfFile);

In bilgi $_FILES daima müşteri gelir, bu yüzden ne yapmak istediğiniz dosyayı kabul ve sunucuda taraması. Ben bir PHP uzantısıdır ve kolay kılan, finfo kullanmanızı tavsiye ediyorum ya:

<?php
// example :-)
$finfo = finfo_open(FILEINFO_MIME);
echo finfo_file($finfo, '/path/to/your/upload/file);
finfo_close($finfo);
?>

Eğer usul beğenmediğiniz bir OO-arayüzü de vardır.

Finfo bir seçenek değilse, sen file kontrol etmek için unix komutunu kullanabilirsiniz.

Ayrıca, birçok kişi bir sargı üzerinden dosyaları hizmet öneririz. Ben bu bir yırtık am, bu bir çözüm olabilir ama) dosyalar sunucu üzerinde hala ve b) bu ​​gibi dosyaları hizmet etmek pahalı çünkü idealden uzaktır bulunuyor.

Benim Apache web sunucusu yapılandırmalarında ben gerçek dosya içeriğini bir dosya komut dosyası olarak ya da çalışan olmadığını belirlemek inanmıyorum. Metin veya resim formatında bir dosyayı görüntülemek veya bir komut dosyası olarak çalıştırmak isteyip olarak belirlenmesi biten dosyayı eşleştirerek yapılır.

Örneğin, apache yapılandırma dosyası, httpd.conf içinde bir direktif

AddType application / x-httpd-php. Php

bir php komut dosyası olarak çalıştırmak. php uzantılı dosyaları çalıştırmak için sunucu söyler. Dolayısıyla, sadece yüklenen dosyaların hiçbiri bir. Php biten, ya da diğer herhangi bir komut çalıştırılabilir biten veya dosyaları eklemek için kullanın biten herhangi bir dosya ile kaydedildiğinden emin olun.