Asosiy matnga o'tish
Blog

Veb

Fayl yuklash zaifliklari va ulardan himoyalanish

Avatar yoki hujjat yuklash formasi serverda kod ishga tushirishga yo'l ochishi mumkin. Fayl turini tekshirish, saqlash joyi va nomlash bo'yicha amaliy qoidalar.

· 8 daq. o'qish

Foto: unspecified, CC0 · Wikimedia Commons

Deyarli har bir veb-ilovada fayl yuklash bor: profil rasmi, shartnoma skani, Excel hisobot, ariza ilovasi. Bu oddiy funksiya ko'rinadi, lekin noto'g'ri qurilsa, u eng xavfli zaifliklardan biriga aylanadi — foydalanuvchi serverga o'z faylini qo'yadi, server esa uni saqlaydi va ba'zan ishga tushiradi.

OWASP bu xavfni alohida "Unrestricted File Upload" sifatida tavsiflaydi, CWE'da esa u CWE-434 (Unrestricted Upload of File with Dangerous Type). Ekspertizada fayl yuklash formalari odatda alohida e'tibor bilan sinab ko'riladi.

Nima noto'g'ri ketishi mumkin

1. Serverda kod ishga tushishi

Eng og'ir holat. Foydalanuvchi photo.php yoki photo.jpg.php nomli fayl yuklaydi, u veb-serverning ommaviy papkasiga tushadi, keyin https://example.uz/uploads/photo.php manzilini ochadi — va PHP kodi serverda bajariladi. Bu hujumchiga serverni to'liq boshqarish imkonini berishi mumkin.

2. Saqlangan XSS

SVG va HTML fayllar ichida JavaScript bo'lishi mumkin. Agar bunday fayl saytning o'z domenidan brauzerda ochilsa, skript shu sayt nomidan, foydalanuvchi sessiyasi bilan ishlaydi.

3. Yo'lni aylanib o'tish (path traversal)

Fayl nomi ../../config/app.php kabi bo'lsa va server uni to'g'ridan-to'g'ri yo'lga qo'shsa, fayl mo'ljallanmagan joyga yozilishi, mavjud faylning ustiga yozilishi mumkin.

4. Xizmatni ishdan chiqarish

Juda katta fayllar, juda ko'p fayllar yoki "zip bomb" kabi arxivlar disk va xotirani to'ldirib, serverni sekinlashtiradi.

5. Begona fayllarga kirish

Yuklangan shaxsiy hujjatlar ommaviy papkada saqlansa va nomlari taxmin qilinadigan bo'lsa (passport_15.pdf), boshqa foydalanuvchilar ularni ochishi mumkin. Bu aslida IDOR'ning bir ko'rinishi.

Asosiy qoida: yuklangan fayl — ishonchsiz ma'lumot. Uni hech qachon ishga tushirmang, nomiga ishonmang va ommaviy papkada foydalanuvchi bergan nom bilan saqlamang.

Himoya qatlamlari

Ruxsat etilgan turlar ro'yxati (allowlist)

Taqiqlangan kengaytmalar ro'yxati (".php mumkin emas") ishlamaydi: .phtml, .php5, .phar va boshqa variantlar doim qoladi. Aksincha, faqat kerakli turlarni ruxsat eting va faylning haqiqiy mazmunini (MIME turi) tekshiring, faqat kengaytmani emas.

Laravel'da:

$request->validate([
    'avatar'   => ['required', 'file', 'mimes:jpg,jpeg,png,webp', 'max:2048'],
    'contract' => ['required', 'file', 'mimetypes:application/pdf', 'max:10240'],
]);

mimes qoidasi faylning mazmunidan MIME turini aniqlaydi. max kilobaytlarda beriladi. Rasmlar uchun image yoki dimensions qoidalari ham foydali.

Fayl nomini server o'zi beradi

Foydalanuvchi bergan nomni saqlash uchun ishlatmang. Tasodifiy nom yarating va asl nomni (kerak bo'lsa) faqat bazada, ko'rsatish uchun saqlang:

$path = $request->file('contract')->store('contracts', 'private');
// natija: contracts/7Hq2...xZ.pdf

Document::create([
    'user_id'       => $request->user()->id,
    'path'          => $path,
    'original_name' => $request->file('contract')->getClientOriginalName(),
]);

store() tasodifiy nom va mazmunga mos kengaytma beradi, bu path traversal'ni ham yopadi.

Ommaviy papkadan tashqarida saqlang

Shaxsiy hujjatlar public/ ichida bo'lmasligi kerak. Laravel'da storage/app/private kabi disk ishlating va faylni kontroller orqali, egalikni tekshirib bering:

public function download(Document $document)
{
    $this->authorize('view', $document);

    return Storage::disk('private')->download(
        $document->path,
        $document->original_name
    );
}

Shunda faylga to'g'ridan-to'g'ri havola yo'q, har bir yuklab olish avtorizatsiyadan o'tadi.

Yuklash papkasida skriptlarni bajarishni taqiqlang

Agar rasmlar ommaviy papkada bo'lishi kerak bo'lsa (masalan, avatarlar), veb-server shu papkada hech qanday skriptni ishga tushirmasligi kerak. nginx uchun:

location ^~ /storage/ {
    location ~ \.(php|phtml|phar)$ { deny all; }
}

Bu ikkinchi himoya chizig'i: validatsiya qandaydir sabab bilan o'tkazib yuborsa ham, fayl kod sifatida bajarilmaydi.

SVG va HTML bilan ehtiyot bo'ling

Agar SVG kerak bo'lmasa, uni ruxsat etilganlar ro'yxatiga qo'shmang. Foydalanuvchi fayllarini ko'rsatishda xavfsiz sarlavhalar qo'ying:

add_header X-Content-Type-Options "nosniff" always;

Yuklab olinadigan hujjatlar uchun Content-Disposition: attachment brauzerga faylni sahifa sifatida ochmaslikni bildiradi. Iloji bo'lsa, foydalanuvchi fayllarini alohida domendan bering.

Rasmlarni qayta ishlang

Yuklangan rasmni qayta kodlash (masalan, o'lchamini o'zgartirib, qayta saqlash) rasm ichiga yashiringan qo'shimcha ma'lumotni va metama'lumotlarni (EXIF, jumladan GPS koordinatalari) olib tashlaydi.

Hajm va son cheklovlari

Ilova darajasida max qoidasidan tashqari, veb-server va PHP darajasida ham chegaralar bo'lsin:

client_max_body_size 10m;
upload_max_filesize = 10M
post_max_size = 12M

Yuklash marshrutlariga so'rovlar sonini cheklash (rate limiting) qo'shing.

Tekshirish ro'yxati

  • Faqat kerakli fayl turlari ruxsat etilganmi va mazmun bo'yicha tekshiriladimi?
  • Fayl nomi server tomonida yaratiladimi?
  • Shaxsiy hujjatlar ommaviy papkadan tashqarida saqlanadimi?
  • Yuklab olishda egalik tekshiriladimi?
  • Yuklash papkasida PHP fayl ochilsa, u bajariladimi yoki rad etiladimi?
  • SVG va HTML yuklash mumkinmi va ular qanday ko'rsatiladi?
  • Hajm chegarasi ilova, PHP va veb-server darajasida bormi?

Oxirgi bandlarni xavfsiz tarzda o'zingiz sinab ko'rishingiz mumkin: zararsiz test.php faylini (masalan, faqat matn chiqaradigan) yuklashga urinib ko'ring va natijani kuzating — faqat o'z test muhitingizda.

Xulosa

Fayl yuklash xavfsizligi bitta qoidaga emas, bir nechta qatlamga tayanadi: validatsiya, nomlash, saqlash joyi, veb-server sozlamasi va avtorizatsiya. Bitta qatlam o'tkazib yuborilsa, keyingisi ushlab qoladi. Bizning jarayonda Claude AI agenti barcha yuklash nuqtalarini, validatsiya qoidalarini va server konfiguratsiyasini tez ko'rib chiqadi, mutaxassis esa ularni amalda sinab, tuzatishlarni kiritadi.

Loyihangizdagi fayl yuklash formalari xavfsizligini tekshirmoqchi bo'lsangiz, skanerlash uchun ariza qoldiring. Biz ularni rasmiy ekspertizadan oldin tekshirib, teshiklarni yopishga yordam beramiz.