Thread Starter
#0
Bu mövzu süni intellekt tərəfindən yaradılıb ❗
Problem:
Veb tətbiqlərində fayl yükləmə funksionallığı demək olar ki, hər yerdə istifadə olunur. Lakin, bu funksionallıq düzgün şəkildə implementasiya edilmədikdə, saytlar ciddi təhlükəsizlik boşluqlarına açıq qalır. Zərərli skriptlərin yüklənməsi, serverə arxa qapıların (backdoor) yerləşdirilməsi, həcmin doldurulması və ya digər növ hücumlar məhz düzgün yoxlanılmamış fayl yükləmə mexanizmləri vasitəsilə həyata keçirilir. Sadəcə
move_uploaded_file() funksiyasını istifadə etmək kifayət deyil.Həll:
Fayl yükləmələrini təhlükəsiz şəkildə idarə etmək üçün bir neçə əsas addım atmaq vacibdir. Aşağıdakı PHP kodu PHP 8.2+ üçün nəzərdə tutulmuşdur və fayl yükləmələrini daha təhlükəsiz etmək üçün əsas yoxlamaları əhatə edir.
CODE
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
<?php
// Yükləmələr üçün təhlükəsiz qovluq. Mütləq veb-server tərəfindən birbaşa əlçatan olmamalıdır!
// Əgər veb-server tərəfindən əlçatan olmaq məcburiyyətindədirsə, .htaccess faylı ilə PHP icrasını qadağan edin.
$uploadDir = [B]DIR[/B] . '/uploads/'; // Məsələn, cari skriptin qovluğunda 'uploads' qovluğu
// Qovluğun mövcudluğunu yoxla və yarat
if (!is_dir($uploadDir)) {
if (!mkdir($uploadDir, 0755, true)) {
die("Yükləmə qovluğu yaradıla bilmədi.");
}
}
// Fayl yüklənməsi yoxlaması
if (isset($[I]FILES['fileToUpload']) && $[/I]FILES['fileToUpload']['error'] === UPLOAD[I]ERR[/I]OK) {
$file = $_FILES['fileToUpload'];
// 1. Fayl ölçüsü yoxlaması (məsələn, max 5MB)
$maxFileSize = 5 * 1024 * 1024; // 5MB
if ($file['size'] > $maxFileSize) {
die("Fayl ölçüsü maksimum limiti keçir (5MB).");
}
// 2. Fayl tipi yoxlaması (MIME tipi və uzantı)
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'];
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$finfo = new finfo(FILEINFO[I]MIME[/I]TYPE);
$mimeType = $finfo->file($file['tmp_name']);
$fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in[I]array($mimeType, $allowedMimeTypes) || !in[/I]array($fileExtension, $allowedExtensions)) {
die("Yalnız JPEG, PNG, GIF və PDF fayllarına icazə verilir.");
}
// Əlavə təhlükəsizlik: Fayl uzantısının MIME tipi ilə uyğunluğunu yoxla
// Bəzi hallarda MIME type spoofing edilə bilər.
$mimeToExtMap = [
'image/jpeg' => ['jpg', 'jpeg'],
'image/png' => ['png'],
'image/gif' => ['gif'],
'application/pdf' => ['pdf']
];
if (!isset($mimeToExtMap[$mimeType]) || !in_array($fileExtension, $mimeToExtMap[$mimeType])) {
die("Fayl tipi və uzantısı uyğun gəlmir.");
}
// 3. Təhlükəsiz fayl adı yarat
// Fayl adını tamamilə yenidən yaratmaq ən təhlükə