Web bakan uygulaması ile dizin kastetmek önlenmesi - düzenli ifadeler kurşun geçirmez mi?

6 Cevap php

Ben bir kullanıcı dinamik URL'den belirlenen bir dosya indirmek için izin gereken bir durum yaşıyorum. Indirme başlamadan önce, bazı kimlik doğrulaması yapmak gerekir, bu yüzden indirme ilk bir komut dosyası ile çalışmak zorundadır. Tüm dosyalar manuel indirilmesini engellemek için web kök dışında saklanır.

Örneğin, aşağıdakilerden herhangi birini indirme bağlantıları olabilir:

Temelde, klasör derinliği değişebilir.

To prevent a directory traversal, like say: http://example.com/downloads/../../../../etc/passwd I need to obviously do some checking on the URI. (Note: I do not have the option of storing this info in a database, the URI must be used)

Aşağıdaki sıradanifade bir kullanıcı balık şey girmezse emin kurşun geçirmez olacaktır:

preg_match('/^\/([-_\w]+\/)*[-_\w]+\.(zip|gif|jpg|png|pdf|ppt|png)$/iD', $path)

Eminim URI aklı başında yapmanın başka ne gibi seçenekler var? Muhtemelen PHP realpath kullanıyor?

6 Cevap

Ben bir PHP geliştiricisi değilim ama böyle bir senaryo için bir Regex tabanlı koruma kullanarak bir kasırga karşı bir T-shirt giymiş gibi olduğunu söyleyebilirim.

(OS onun mutlak bir dosya yolu dönüştürmek için bir şans olmuştur önce uygulama belirli bir dosya adı ayrıştırır sayede) sorun bu tür güvenlik dilinde bir Canonicalization vulnerability olarak bilinir. Saldırganlar hemen hemen kesinlikle Regex ile uyumlu olması için başarısız olur dosya permütasyon herhangi bir sayı ile gelmek mümkün olacak.

Eğer must Regex kullanırsanız, o zaman (maç only geçerli dosya adları, başka ilginiz reddetmek) mümkün olduğunca kötümser olun. Ben PHP Kurallı yöntemleri hakkında bazı araştırma yapmak öneririm.

Bunu için htaccess kullanabilirsiniz düşünüyorum.

Ben şu 3 kontroller ideal bir çözüm olabilir mi

  • Dosya dosya yolu neye benzeyeceğini bir genel kabul Regexp maçlar emin olun
  • Kullanıcıların bir kanonik form dosyası talep olsun ve emin bir temel dizin içinde yapmak için karşılaştırmak için (PHP) realpath kullanın
  • PHP v5.3 ile başlayarak, (fopen ile, fread, vb dahil) bu klasörün dışındaki dosyaları muhtemelen okunamaz, böylece belirli bir klasöre open_basedir'inizi kısıtlamak için ini_set kullanabilirsiniz

Dosya adlarınız içerecek Hangi karakterler? Sadece [a-zA-Z0-9] tek nokta çizgiler bulunuyor ve bölü sonra başka bir şey şerit çekinmeyin.

Benim çözüm

$filesPath = realpath(".");
$reqPath = realpath($_GET["file"]);
$pat = "%^".preg_quote($filesPath)."%";

if(preg_match($pat,$reqPath)){
    echo "File found";
}else{
    echo "Access denied"
}
?>