Regex ile dosya uzantısı mı kontrol ediyorsun, bu zamanda kimse direkt çalıştırılabilir bir dosya yüklemez :D virüs.jpg ama arkaplanda virüs.php gömülü olabilir, resim çağrıldığı an puff. PHP'de bu tip durumları daha derinden mime type denen kavrama yaklaşarak çözmek gerek. Extension değil dosya içeriği, formatı önemli. Örneğin şu küçük kütüphane güzel bir örnek.

Eskiden kullandığım ufak bir fonksiyon, örrnek olması amacıyla bırakayım.


public function imageUpload(){
$query = $this->db->prepare("SELECT * FROM limits WHERE id=1");
$query->execute(array());
$limits != null ? $query->fetch(PDO::FETCH_ASSOC) : 7;

$image = new Bulletproof\Image($_FILES);
$upname = $image->getName();
$svname = hash('sha512', date("d-m-Y H:i:s", time())).rand(222, 222222);

preg_match_all('/[0-9]+/', $limits['max_up_file_resolution'], $matches, PREG_SET_ORDER);
$maxwidth = $matches[0][0];
$maxheight = $matches[1][0];

$image->setName($svname)
->setLocation(__DIR__ . "/../../uploads")
->setMime(array('png', 'jpg', 'jpeg', 'gif'))
->setDimension($maxwidth, $maxheight)
->setSize('1', $limits['max_up_file_size']);

if($image["pictures"]){
if($image->upload()){
$query = $this->db->prepare("INSERT uploads SET userid=:userid, date=:date, ip=:ip, upname=:upname, svname=:svname, ext=:ext, size=:size, resolution=:resolution");
$addvalue = $query->execute(array(
"userid" => $this->common->post('userid'),
"date" => date("d-m-Y H:i:s", time()),
"ip" => $this->getIP(),
"upname" => $upname,
"svname" => $svname,
"ext" => $image->getMime(),
"size" => $image->getSize(),
"resolution" => $image->getWidth().'x'.$image->getHeight()
));

if ($addvalue)
return true;
else
return false;
} else{
return $image["error"];
}
}
}


Görüldüğü üzere dosya ismi değiştirilmesi önemli, en azından saldırgan sonraki adımı resmin yeni ismini öğrenmek olacaktır. Biraz terletmek için.

Resimlerin yüklendiği veya kullanıldığı klasörler için .htaccess ile belirli sınırlamalar getirilmeli, çalıştırılabilir dosyalara izin verilmemeli, mesela PHP veya flash içerikli dosyalar.