Asosiy matnga o'tish
Blog

Veb

Laravel loyihasi xavfsizligi: ekspertizadan oldin 12 ta tekshiruv

APP_DEBUG, trustProxies, CSRF, mass assignment, policy'lar, rate limiting va boshqa 12 ta band — Laravel ilovasini ekspertizaga tayyorlash uchun amaliy ro'yxat.

· 9 daq. o'qish

Foto: Negative Space, CC0 · Wikimedia Commons

Laravel xavfsizlik bo'yicha yaxshi standartlar bilan keladi: CSRF himoyasi, parollarni xeshlash, shifrlangan cookie'lar. Lekin ekspertizada topiladigan muammolarning katta qismi freymvorkning o'zidan emas, uning sozlanishidan kelib chiqadi. Quyida biz o'z loyihalarimizda va ekspertiza tajribamizda tekshiradigan 12 ta bandni keltiramiz. Misollar Laravel 11/12 tuzilmasi uchun yozilgan.

1. APP_DEBUG va APP_ENV

Production'da .env faylida:

APP_ENV=production
APP_DEBUG=false

APP_DEBUG=true bo'lsa, xato sahifasida stek izi, fayl yo'llari va ba'zan muhit o'zgaruvchilari ko'rinadi. Tekshirish uchun mavjud bo'lmagan marshrutga yoki noto'g'ri parametr bilan so'rov yuboring va javobda ichki tafsilot yo'qligiga ishonch hosil qiling.

2. trustProxies va Host sarlavhasi

Ilova Nginx yoki balanser ortida ishlasa, proksi sarlavhalariga ishonish kerak. Lekin hammasiga emas. O'z mahsulotimizda ekspertiza Host sarlavhasi orqali in'ektsiyani topdi: ilova X-Forwarded-Host ga ishonib, parolni tiklash havolalarini hujumchi ko'rsatgan domen bilan yasashi mumkin edi. Tuzatish — faqat kerakli sarlavhalarga ishonish:

// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->trustProxies(at: '127.0.0.1', headers:
        Request::HEADER_X_FORWARDED_FOR |
        Request::HEADER_X_FORWARDED_PORT |
        Request::HEADER_X_FORWARDED_PROTO);
})

Qo'shimcha ravishda production'da URL::forceRootUrl(config('app.url')) va URL::forceScheme('https') ni AppServiceProvider da belgilang.

3. CSRF istisnolari

CSRF himoyasi standart yoqilgan, lekin vaqt o'tishi bilan validateCsrfTokens(except: [...]) ro'yxati kengayib ketadi. Har bir istisnoni ko'rib chiqing: u faqat tashqi xizmat callback'i (masalan, to'lov provayderi) uchun bo'lishi va o'sha marshrutda imzo yoki boshqa tekshiruv bo'lishi kerak.

4. Mass assignment

$guarded = [] yoki Model::unguard() — xavfli belgi. Foydalanuvchi so'rovga is_admin=1 yoki balance=... qo'shib yuborsa, u modelga yozilib ketishi mumkin. $fillable da faqat ruxsat etilgan maydonlarni sanab o'ting va $request->all() o'rniga $request->validated() dan foydalaning.

5. Avtorizatsiya: Policy va Gate

Autentifikatsiya "kim?" degan savolga javob beradi, avtorizatsiya esa "bunga haqqi bormi?". /invoices/15 ni ochgan foydalanuvchi /invoices/16 ni ham ocha oladimi? Bu IDOR (CWE-639) deb ataladi. Har bir resurs uchun Policy yozing va controller'da $this->authorize('view', $invoice) yoki Gate::authorize() chaqiring. Ro'yxat so'rovlarini ham joriy foydalanuvchi yoki tashkilot bo'yicha cheklang.

6. Biznes-mantiq va holat tekshiruvi

Ekspertiza bizning platformada ikkita biznes-mantiq topilmasini qayd etdi. Biri — to'lov provayderi tasdiqlamasdan "to'lov muvaffaqiyatli" sahifasining ko'rsatilishi. To'g'ri yondashuv: to'lov holatini faqat provayderning server-server callback'i yoki API so'rovi orqali o'zgartirish, success sahifasi esa bazadagi haqiqiy holatni ko'rsatishi kerak. Ikkinchisi — holat tekshirilmasdan amal bajarish. Har bir o'tishda (masalan, "qoralama → yuborilgan") joriy holatni server tomonda tekshiring.

7. Rate limiting

Login, parolni tiklash, OTP yuborish va qidiruv kabi marshrutlarga cheklov qo'ying:

RateLimiter::for('login', function (Request $request) {
    return Limit::perMinute(5)->by(
        Str::lower($request->input('email')).'|'.$request->ip()
    );
});

Marshrutga ->middleware('throttle:login') qo'shing. API marshrutlari uchun ham alohida limit belgilang.

config/session.php va .env:

SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax
SESSION_ENCRYPT=true

Login'dan keyin $request->session()->regenerate(), chiqishda invalidate() va regenerateToken() chaqirilayotganini tekshiring. Laravel starter kit'lari buni qiladi, lekin maxsus yozilgan login oqimlarida ko'pincha unutiladi.

9. Bog'liqliklar auditi

composer audit
npm audit --omit=dev

Natijada ma'lum zaifligi bor paketlar chiqsa, yangilang. composer.lock repozitoriyda bo'lishi va production'ga composer install --no-dev --optimize-autoloader bilan o'rnatilishi kerak.

10. Imzolangan URL'lar

Email tasdiqlash, fayl yuklab olish yoki obunani bekor qilish havolalarida ID'ni ochiq qoldirmang. URL::temporarySignedRoute('invoice.download', now()->addMinutes(30), [...]) va marshrutda signed middleware ishlating. Shunda havolani o'zgartirib boshqa yozuvga kirib bo'lmaydi.

11. Ma'lumot oshkor bo'lishi

Bizning ekspertizada ikkita topilma aynan shu turdagi edi. Birinchisi — Ziggy orqali brauzerga butun marshrutlar ro'yxati, jumladan admin marshrutlari uzatilishi. config/ziggy.php da only yoki groups bilan faqat kerakli marshrutlarni chiqaring. Ikkinchisi — API javoblarida ortiqcha maydonlar. Modelni to'g'ridan-to'g'ri qaytarish o'rniga API Resource ishlating va $hidden ni tekshiring. Shuningdek X-Powered-By va server versiyasini sarlavhalardan olib tashlang.

12. Fayl yuklash va ochiq kataloglar

  • Yuklangan fayllarni mimes, max qoidalari bilan tekshiring va iloji bo'lsa public emas, yopiq diskda saqlang.
  • Veb-server ildizi faqat public/ bo'lsin. .env, storage/logs, .git brauzerdan ochilmasligini tekshiring.
  • telescope, horizon, phpinfo yoki debug-panellar production'da yopiq yoki faqat admin uchun bo'lsin.

Yaxshi qoida: har bir bandni "kodda bor" deb emas, "tekshirib ko'rdim" deb belgilang.

Qanday tekshirish kerak

Ro'yxatni bir marta o'qib chiqish yetarli emas. Har bir band uchun aniq tekshiruv qiling: curl -H "X-Forwarded-Host: example.org" bilan parolni tiklash havolasini so'rang, boshqa foydalanuvchi ID'si bilan resursni oching, loginni ketma-ket 10 marta noto'g'ri kiriting. Natijani yozib boring — keyin ekspertizaga javob tayyorlashda aynan shu yozuvlar kerak bo'ladi.

Xulosa

Laravel'da xavfsizlik ko'pincha bitta qator sozlamaga bog'liq. 12 ta bandni ketma-ket ko'rib chiqish ekspertizada chiqadigan odatiy topilmalarning katta qismini oldindan yopadi.

Sipar Laravel loyihalarini shu va boshqa bandlar bo'yicha tekshiradi: Claude AI agenti kod va konfiguratsiyani ko'rib chiqadi, mutaxassis topilmalarni tasdiqlab tuzatadi. Loyihangizni tekshirib ko'rish uchun skanerlash uchun ariza qoldiring.