Django Xavfsizligi: Production Uchun 7 Muhim Qoida
Muallif: Javohir Abdullayev · · Django

Nega Django Xavfsizligi Muhim?
Django o'zining mustahkam himoya mexanizmlari bilan mashhur bo'lsa-da, standart sozlamalar bilan loyihani to'g'ridan-to'g'ri jonli serverga (production) chiqarish katta xavf tug'diradi. Kiberhujumchilar doimiy ravishda ochiq qolgan nozik nuqtalarni (vulnerabilities), xatolik xabarlarini va noto'g'ri sozlangan konfiguratsiyalarni qidirib yurishadi. Agar loyihangiz xavfsizligi to'g'ri ta'minlanmasa, foydalanuvchilar shaxsiy ma'lumotlari sizib chiqishi, ma'lumotlar bazasi o'chib ketishi yoki serveringiz botnet qismiga aylanishi mumkin.
Ushbu maqolada har bir Django dasturchisi production bosqichida qo'llashi shart bo'lgan 7 ta amaliy xavfsizlik qoidasi va eng yaxshi amaliyotlarni (best practices) ko'rib chiqamiz.
1. DEBUG = False va Maxfiy Kalitlarni Yashirish
Dasturlash jarayonida DEBUG = True rejimi qulay vosita hisoblanadi: u xatolik kelib chiqqanda to'liq stack trace, o'zgaruvchilar qiymati va hatto SQL so'rovlarni brauzerda chiroyli qilib ko'rsatadi. Ammo production muhitida bu funksiya hackerlar uchun tayyor xaritadir.
Hech qachon SECRET_KEY va maxfiy ma'lumotlarni to'g'ridan-to'g'ri settings.py faylida saqlamang. Ularni muhit o'zgaruvchilariga (environment variables) o'tkazing va python-dotenv yoki django-environ kutubxonalaridan foydalaning:
import os
from pathlib import Path
DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True'
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
if not SECRET_KEY:
raise ValueError("SECRET_KEY topilmadi! Muhit o'zgaruvchisini sozlang.")2. ALLOWED_HOSTS va CSRF Sozlamalarini Qat'iy Belgilash
ALLOWED_HOSTS ro'yxati sizning veb-saytingiz qaysi domenlar orqali so'rov qabul qila olishini belgilaydi. Agar uni ['*'] deb qoldirsangiz, HTTP Host header hujumlariga (masalan, parolni tiklash havolalarini soxtalashtirish) yo'l ochib berasiz.
Domenlarni aniq ko'rsating:
ALLOWED_HOSTS = ['pycoder.uz', 'www.pycoder.uz', '185.100.50.20']
CSRF_TRUSTED_ORIGINS = [
'https://pycoder.uz',
'https://www.pycoder.uz',
]Django 4+ versiyalarida tashqi manbalardan keladigan POST so'rovlarni himoyalash uchun CSRF_TRUSTED_ORIGINS sozlamasini ham to'liq HTTPS protokoli bilan kiritish majburiydir.
3. SQL Injection va Xavfsiz ORM Foydalanishi
Django ORM o'z-o'zidan SQL injection hujumlaridan himoyalangan, chunki u parametrlangan so'rovlardan foydalanadi. Biroq, ko'pchilik dasturchilar murakkab so'rovlar yozishda xom (raw) SQL dan ehtiyotsizlik bilan foydalanishadi:
# XAVFLI USUL (hech qachon bunday qilmang):
user_input = request.GET.get('username')
User.objects.raw(f"SELECT * FROM auth_user WHERE username = '{user_input}'")
# XAVFSIZ USUL (parametr uzatish):
User.objects.raw("SELECT * FROM auth_user WHERE username = %s", [user_input])
# ENG YAXSHI USUL (standart ORM):
User.objects.filter(username=user_input)Har doim imkon qadar standart ORM metodlaridan (filter, get, annotate) foydalaning. Agar raw() yoki extra() kerak bo'lsa, qiymatlarni f-string orqali emas, faqat parametr sifatida uzating.
4. XSS (Cross-Site Scripting) Hujumlaridan Saqlanish
Django shablon (template) tizimi barcha o'zgaruvchilarni avtomatik tarzda HTML-escape qiladi. Bu <script> kabi zararli teglarning brauzerda bajarilishini oldini oladi. Lekin dasturchilar ba'zan HTML formatdagi matnlarni chiqarish uchun |safe filtridan o'rinsiz foydalanadilar.
Foydalanuvchi tomonidan kiritilgan har qanday ma'lumotga (izohlar, forum xabarlari, bio qismi) hech qachon |safe filtrini to'g'ridan-to'g'ri qo'llamang. Agar boy matn (rich-text) kerak bo'lsa, ma'lumotlar bazasiga yozishdan oldin bleach kutubxonasi yordamida HTML teglarni tozalab oling.
5. HTTPS va Xavfsiz Cookie Sozlamalari (SSL/TLS)
Production serverda barcha trafik HTTPS orqali o'tishi shart. HTTP orqali uzatiladigan parollar va sessiya kalitlari oraliqdagi har qanday tarmoq kuzatuvchisi tomonidan o'g'irlanishi mumkin. settings.py fayliga quyidagi qatorlarni qo'shing:
# HTTPS ga yo'naltirish
SECURE_SSL_REDIRECT = True
# Cookie-larni faqat HTTPS orqali uzatish
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# JavaScript orqali cookie o'g'irlanishini oldini olish
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
# HSTS sozlamalari (brauzerni faqat HTTPS ishlatishga majburlash)
SECURE_HSTS_SECONDS = 31536000 # 1 yil
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# Clickjacking himoyasi
X_FRAME_OPTIONS = 'DENY'6. Parol Siyosati va Brute-Force Hujumlariga Cheklov
Foydalanuvchilar oddiy parollar (masalan, 12345678 yoki admin123) tanlashiga yo'l qo'ymang. Django-da o'rnatilgan parol tekshiruvchilarini yoqing:
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 10}},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]Shuningdek, kirish (login) sahifasini brute-force (parolni ketma-ket taxmin qilish) hujumlaridan himoya qilish uchun django-axes yoki django-ratelimit paketlarini o'rnating. Ular belgilangan urinishlar sonidan so'ng IP-manzilni vaqtincha bloklaydi.
7. check --deploy Buyrug'idan Foydalanish
Django-da tizimni avtomat tekshiruvchi ajoyib o'rnatilgan buyruq bor. Loyihangizni serverga chiqarishdan oldin quyidagi buyruqni albatta ishga tushiring:
python manage.py check --deployBu buyruq sizning sozlamalaringizni tahlil qiladi va agar biror xavfsizlik parametri (masalan, DEBUG, SSL sozlamalari yoki cookie bayroqlari) unutilgan bo'lsa, aniq ogohlantirishlar ro'yxatini chiqarib beradi. Barcha xatoliklar to'g'rilanmaguncha loyihani production muhitiga yuklamang.
Xulosa
Xavfsizlik bir martalik jarayon emas, balki doimiy odatdir. Kichik e'tiborsizlik loyihangiz obro'si va foydalanuvchilar ishonchiga jiddiy putur yetkazishi mumkin. Yuqorida sanab o'tilgan qoidalarni o'z loyihangizga tatbiq eting, bog'liqliklarni (dependencies) muntazam ravishda pip audit bilan tekshirib turing va kodingizni doimo yangilab boring.
Teglar: #Django #Xavfsizlik #Backend #Production #Python