Autentifikatsiya, JWT, ruxsatlar, throttling, CORS, CSRF va production sozlamalari
10-sinfAdvanced Python Back-end4-hafta · 10-darsAuthentication, Basic/Session/Token va JWT arxitekturasi.
Permissions, custom permission va throttling (429).
Brauzer himoyasi va ma'lumot validatsiyasi.
.env, DEBUG, HTTPS, security checklist.
Nega bu eng muhim qatlam
Qimmatbaho javohirlar binosi o'xshatishi
Bitta qulfga ishonmaymiz: bir qatlam buzilsa, keyingisi to'xtatadi. Qatlam ustiga bosing.
Siz kimsiz?
«Siz kimsiz?»
Mijoz kimligini isbotlovchi kalit yuboradi. Bloklamaydi, faqat aniqlaydi.
«Nima qila olasiz?»
Resursga haqi yo'q bo'lsa: 401 yoki 403.
Login:parol Base64 da. Base64 shifrlash emas! Faqat testda.
sessionid cookie. Brauzerga qulay, CSRF'ga moyil.
Server tasodifiy token beradi. Mobil uchun yaxshi, lekin har so'rovda bazaga murojaat.
Uch qism nuqta (.) bilan ajratiladi. JWT bazaga murojaat qilmasdan o'z to'g'riligini tasdiqlaydi.
Qisqa muddat: 5-15 daqiqa.
Har so'rovda yuboriladi. O'g'irlansa tez yaroqsiz bo'ladi.
Uzoq muddat: 1 kundan 1 oygacha.
Faqat yangi access olish uchun ishlatiladi.
Pastga bosing: nima yozmaslik kerak
djangorestframework-simplejwt o'rnatiladi.from datetime import timedelta
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=10),
"REFRESH_TOKEN_LIFETIME": timedelta(days=7),
"ROTATE_REFRESH_TOKENS": True,
"BLACKLIST_AFTER_ROTATION": True,
"UPDATE_LAST_LOGIN": True,
}
INSTALLED_APPS += ["rest_framework_simplejwt.token_blacklist"]
Rotate + blacklist: refresh tokenni qayta ishlatish hujumini pasaytiradi. Keyin python manage.py migrate.
Nima qila olasiz? Necha marta?
| Sinf | Kimga ruxsat |
|---|---|
AllowAny | Hammaga, mehmonlarga ham |
IsAuthenticated | Faqat tizimga kirganlarga (aks holda 401) |
IsAdminUser | Faqat is_staff=True |
IsAuthenticatedOrReadOnly | Mehmon faqat o'qiydi (GET) |
from rest_framework.permissions import BasePermission
class IsAuthor(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated
def has_object_permission(self, request, view, obj):
return obj.author == request.user
Egasi bo'lmasa DRF avtomatik 403 Forbidden qaytaradi. (O'quv misol.)
Mehmonlar, IP manzil bo'yicha.
Tizimga kirgan foydalanuvchilar.
Alohida joy, masalan parolni tiklash.
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_RATES": {
"anon": "60/min",
"user": "300/min",
"login_anon": "5/min",
},
}
Brauzer va ma'lumot himoyasi
Server brauzerga «react-loyiha.uz ga ruxsat beraman» deydi. Django: django-cors-headers.
CORS_ALLOW_ALL_ORIGINS = True
# productionda hech qachon!CORS_ALLOWED_ORIGINS = os.getenv(
"CORS_ALLOWED_ORIGINS", ""
).split(",")Sessiya va cookie yaratildi.
Haker sahifasida yashirin forma bor.
Bank so'rovni qonuniy deb o'ylaydi!
Har POST/PUT da tasodifiy token; haker uni bilmaydi.
name = "'; DROP TABLE users; --"
# qo'lda SQL ga yopishtirish: bazani o'chiradiemail = serializers.EmailField()
Post.objects.get(id=pk) # ORM escapingSerializer tekshiradi, ORM xavfli belgilarni zararsizlantiradi. Raw SQL dan qoching. XSS: izohga JavaScript yozish.
Sozlamalar va checklist
DEBUG = False
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000 # 1 yil
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = "DENY"
SECURE_REFERRER_POLICY = "same-origin"
DEBUG=False, ALLOWED_HOSTS, .env (sir kodda emas).
HTTPS, secure cookies, HSTS, faqat kerakli CORS originlar.
JWT access qisqa, refresh rotate+blacklist, login throttling.
Upload: MIME va hajm limiti; logging, security headers.
Foydalanuvchi qaysi tokenni har so'rovda yuboradi va u nega qisqa yashaydi?
CORS_ALLOW_ALL_ORIGINS = True; DEBUG = True qoldirish.settings/base.py ga kiriting.IsAuthor permissionini yozib, PostViewSet ga ulang. Boshqa user PATCH qilsa 403 ni tekshiring.
Xavfsizlik: ko'p qatlam, qisqa token, aniq CORS, ishonchsiz kiruvchi ma'lumot.
Uyga vazifa: uyga-vazifa.md. Keyingi dars: tayyor loyihani hostingga joylash (deploy).