Benim düşük seviyeli bazı dizinlerin erişimi engellemek olacak bir işlev oluşturmak için çalışıyorum. Sitemde inşa ederken Örneğin, ben kodlama yaparken /var/www/html/site/uploads/ ben bir hata yapmak gerekir yüklenenler daha alt yüklenmesine izin vermek istemiyorum. Bu da önbellek dosyaları falan çıkarırken bir dizin silme yazım hatası önlemeye yardımcı olacaktır.
Bu kolayca realpath() ve strcasecmp () ile yapılır.
Sorun yoktur dizinleri ile bu işlev için herhangi bir çağrı FALSE dönecektir, çünkü ben mutlak bir yol oluşturmak için () realpath kullanamazsınız olmasıdır. Aşağıda onları doğrulamak için yolları bakarak benim en iyi girişimdir.
function is_sub_dir($path = NULL, $parent_folder = NULL) {
//Convert both to real paths
//Fails if they both don't exist
//$path = realpath($path);
//$parent_folder = realpath($parent_folder);
//Neither path is valid
if( !$path OR !$parent_folder ) {
return FALSE;
}
//Standarize the paths
$path = str_replace('\\', '/', $path);
$parent_folder = str_replace('\\', '/', $parent_folder);
//Any evil parent directory requests?
if(strpos($path, '/..') !== FALSE) {
return FALSE;
}
//If the path is greater
if( strcasecmp($path, $parent_folder) > 0 ) {
return $path;
}
return FALSE;
}
//BAD FOLDER!!!
var_dump(is_sub_dir('/var/www/html/site/uploads/../', '/var/www/html/site/uploads/'));
Herkes düzgün düşük seviyeli klasör erişime karşı korumak için bir yerde dosya yolu blokları koymak nasıl biliyor mu?
: GÜNCEL:
Ben daha bu kontrol yöntemi, birden sunucularının kullanılan yanı sıra belirli bir dizinin daha yüksek dizin oluşturulması olacağını açıklamak istiyorum.
Örneğin, benim yüklenenler dizine ben yöneticiler gibi ...uploads/sub/ gibi yeni alt dizinleri oluşturmak için izin istiyoruz. Benim adminleri yüklenenler klasöründe dosya sistemi ile çalışmak için izin daha güvenli hissediyorum - Verilen dizin is in fact higher üst dizinin daha sigortalamak için güvenilir bir yol bulmaktan.
Yani uploads/sub Tekrar yok, çünkü ben o uploads/sub) Bunu ben (realpath kullanamazsınız oluşturmak uploads/ eskisinden daha yüksektir doğrulamak gerekebilir beri .
PHP ile anında figürlü yüklenenler klasörünün gerçek konumunu gelince.
define('UPLOAD_PATH', realpath(dirname(__FILE__)));
: GÜNCELLEME 2:
Bir fikrim var, ne tam yolunu eksi son dizin kesimi karşılaştırmak için realpath kullanmak olsaydı. Sonra bu son dizin kesimi hala oluşturulan gereken bile - yolun geri kalanı asgari üst dizini maç zorunda olabilir?