Aşağıdaki kurgusal yükleme kodu, yalnızca dosya adının uzantısını ve tarayıcının gönderdiği MIME değerini kontrol ediyor:
$allowed = ['jpg', 'png', 'pdf'];
$extension = strtolower(pathinfo($_FILES['document']['name'], PATHINFO_EXTENSION));
if (!in_array($extension, $allowed, true)) {
exit('Geçersiz uzantı');
}
if ($_FILES['document']['type'] !== 'image/jpeg' &&
$_FILES['document']['type'] !== 'image/png') {
exit('Geçersiz tür');
}
move_uploaded_file(
$_FILES['document']['tmp_name'],
__DIR__ . '/uploads/' . $_FILES['document']['name']
);Bir AI kod inceleme aracına bu parçayı verdiğinizde, özellikle şu somut riskleri aramasını isteyebilirsiniz:
- $_FILES['document']['type'] istemciden geldiği için güvenilir bir dosya türü kanıtı olarak kullanılıyor mu?
- Uzantı ile gerçek içerik birbiriyle uyuşuyor mu?
- Orijinal dosya adı doğrudan hedef yola eklenerek çakışma veya yol manipülasyonu riski oluşturuyor mu?
- Yüklenen dosya web sunucusunun çalıştırabileceği ya da doğrudan sunabileceği bir dizine mi yazılıyor?
- UPLOAD_ERR_* durumu, boyut sınırı ve boş dosya kontrol ediliyor mu?
Daha güvenli bir inceleme sonucu ve düzeltme
Sunucu tarafında geçici dosyanın içeriği incelenmeli, izin verilen türler açıkça eşleştirilmeli ve dosya kullanıcıdan alınan adla kaydedilmemelidir. Örneğin görsel yükleme için kurgusal bir düzeltme şöyle olabilir:
$file = $_FILES['document'] ?? null;
$maxBytes = 5 * 1024 * 1024;
$allowed = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
];
if (!$file || $file['error'] !== UPLOAD_ERR_OK) {
exit('Yükleme başarısız');
}
if ($file['size'] < 1 || $file['size'] > $maxBytes) {
exit('Dosya boyutu geçersiz');
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$detectedMime = $finfo->file($file['tmp_name']);
if (!isset($allowed[$detectedMime])) {
exit('İzin verilmeyen dosya türü');
}
$storedName = bin2hex(random_bytes(16)) . '.' . $allowed[$detectedMime];
$target = '/srv/app-private-uploads/' . $storedName;
if (!move_uploaded_file($file['tmp_name'], $target)) {
exit('Dosya kaydedilemedi');
}Bu örnekte hedef dizinin web kökünün dışında olduğu varsayılmıştır. Dosyaların tarayıcıya sunulması gerekiyorsa uygulama, kimlik ve yetki kontrolünden sonra dosyayı kontrollü bir yanıtla göndermelidir. Görsel kabul eden uygulamalarda ek bir savunma olarak resmi yeniden işlemek; PDF gibi belgelerde ise kullanılan kütüphanenin güvenlik güncellemelerini takip etmek gerekebilir. Bu önlemler, her dosya biçimi için aynı şekilde uygulanabilecek sihirli bir çözüm değildir.
AI önerisini doğrulama adımları
AI'nin bulgularını doğrudan kabul etmek yerine şu kontroller yapılabilir:
- JPEG içeriği taşıyan ancak .png uzantılı bir test dosyasıyla gerçek MIME tespitinin beklenen sonucu verdiğini kontrol edin.
- İstemci MIME bilgisini değiştiren bir istekle kararın $_FILES['type'] değerine bağlı olmadığını doğrulayın.
- Aşırı büyük dosya, boş dosya, hatalı yükleme ve eksik alan senaryolarını test edin.
- Aynı özgün adla iki yükleme yapıp dosyaların birbirinin üzerine yazılmadığını inceleyin.
- Yüklenen dosyanın web kökünden doğrudan çalıştırılamadığını ve yetkisiz kullanıcıya sunulmadığını doğrulayın.
- Kabul edilen her tür için geçerli örnek, uzantısı değiştirilmiş örnek ve bozuk içerik kullanın.
