Daha öncede bu konuda bazı önerilerde bulunmuştum. finfo fonksiyonunun biraz daha güvenliği olduğunu öne sürmüştüm.
Fakat bu fonksiyonunda manipuleye çok açık olduğunu farkettim.
Şimdi bir resim upload işleminin güvenliğini sağlamak için yapacaklarımıza bakalım.
<?php
// file extension ( Dosya uzantı kontrolü - En Kötüsü )
$mime = end(explode('.','test.gif')); // VALID GIF
print_r($mime); // .gif
// getimagesize ( Dosyanın resim çıktısını almak - Kötünün iyisi )
$mime = getimagesize('test.gif')['mime']; // VALID GIF
print_r($mime); // image/gif
// FINFO ( Dosyanın mime yani dosya türünü almak - Biraz daha iyi )
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, 'test.gif'); // VALID GIF
print_r($mime); // image/gif
?>Ama yukarıdaki seçeneklerin tamamı manipuleye açık.
GIF89
<?php
Örnek bu dosyada image/gif olarak dönecektir.
Peki bunu biraz daha zorlarsak ne yapabiliriz ? Dosyanın içeriği üzerinden ilgili dosya türüne göre bir resim oluşturmayı deneyebiliriz bellekte.
<?php
$im = @imagecreatefromgif(file_get_contents('test.gif'));
if($im)
{
echo 'Resim başarıyla oluşturuldu!';
}
else
{
echo 'Resim oluşturma başarısız oldu!';
}
?>Hadi resimleri bu şekilde hallettik ama diğer dosyalarda ne yapacağız ? PHP nin bu konuda doğrulama sisteminin oldukça zayıf olduğunu söylemeliyim. ( Araştırmalarım bunu gösteriyor )
Bu konuda bir beyin fırtınası yapalım dedim önerisi olan arkadaşlar yazabilirmi ?
En güvenli yaklaşım, resim dosyası içinde MZ veya PHP veya ELF-SH taglerini araştırmak.
MZ - .exe için
PHP - .php için
ELF - Linux executable
SH - *nix executable
Bir resim günümüzde eğer tarayıcı sandboxu dışına çıkamıyorsa sunucuyu hedefleyecektir(çoğu zaman, %99.99 oranında) ve en yaygın olarak dosyanın içine php kodu yerleştirip sunucunun açıklarından faydalanmak isteyecektir.
Yazılımları güncel tutmak kadar bu tip önlemleri de dosyayı yüklerken kontrol ettirmek çözüm olabilir ama tamamen projeye bağlı.