AXV

API xavfsizligini ta'minlash

Autentifikatsiya, JWT, ruxsatlar, throttling, CORS, CSRF va production sozlamalari

10-sinfAdvanced Python Back-end4-hafta · 10-dars

Dars rejasi

Kimligini aniqlash

Authentication, Basic/Session/Token va JWT arxitekturasi.

Ruxsat va cheklov

Permissions, custom permission va throttling (429).

CORS, CSRF, inyeksiya

Brauzer himoyasi va ma'lumot validatsiyasi.

Production sozlamalar

.env, DEBUG, HTTPS, security checklist.

01

API xavfsizligi nima?

Nega bu eng muhim qatlam

Haker devorni emas, eshikni tanlaydi

Qimmatbaho javohirlar binosi o'xshatishi

Mijozbrauzer, ilova APIochiq eshik Bazajavohirlar
Baza qanchalik mustahkam bo'lmasin, ochiq API uni himoyasiz qoldiradi.

Defense in Depth: chuqur himoya

AuthenticationSiz kimsiz? PermissionsNima qila olasiz? ThrottlingNecha marta? ValidatsiyaMa'lumot toza?

Bitta qulfga ishonmaymiz: bir qatlam buzilsa, keyingisi to'xtatadi. Qatlam ustiga bosing.

02

Autentifikatsiya va JWT

Siz kimsiz?

Authentication va Authorization

Authentication

«Siz kimsiz?»

Mijoz kimligini isbotlovchi kalit yuboradi. Bloklamaydi, faqat aniqlaydi.

VS

Authorization (Permissions)

«Nima qila olasiz?»

Resursga haqi yo'q bo'lsa: 401 yoki 403.

Autentifikatsiya foydalanuvchini bloklamaydi. Bloklash keyingi qatlam, Permissions ishi.

DRF'dagi standart autentifikatsiya turlari

Basic

Login:parol Base64 da. Base64 shifrlash emas! Faqat testda.

Session

sessionid cookie. Brauzerga qulay, CSRF'ga moyil.

Token

Server tasodifiy token beradi. Mobil uchun yaxshi, lekin har so'rovda bazaga murojaat.

JWT anatomiyasi: Header.Payload.Signature

Headertur: JWTalgoritm: HS256 Payloaduser id, iat, expSHIFRLANMAGAN! SignatureSECRET_KEY bilanxesh imzo

Uch qism nuqta (.) bilan ajratiladi. JWT bazaga murojaat qilmasdan o'z to'g'riligini tasdiqlaydi.

Access va Refresh token

Access token

Qisqa muddat: 5-15 daqiqa.

Har so'rovda yuboriladi. O'g'irlansa tez yaroqsiz bo'ladi.

VS

Refresh token

Uzoq muddat: 1 kundan 1 oygacha.

Faqat yangi access olish uchun ishlatiladi.

Pastga bosing: nima yozmaslik kerak

Payload sirlari

Payload ichiga parol yoki bank kartasi raqamini hech qachon yozmang: u shifrlanmagan.
JWT DRF standart paketida yo'q: djangorestframework-simplejwt o'rnatiladi.

SimpleJWT: qisqa access, uzun refresh

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.

03

Ruxsatlar va Throttling

Nima qila olasiz? Necha marta?

Tayyor ruxsat sinflari

SinfKimga ruxsat
AllowAnyHammaga, mehmonlarga ham
IsAuthenticatedFaqat tizimga kirganlarga (aks holda 401)
IsAdminUserFaqat is_staff=True
IsAuthenticatedOrReadOnlyMehmon faqat o'qiydi (GET)

Custom permission: faqat o'z postini tahrirlash

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.)

Throttling: so'rovlar sonini cheklash

AnonRateThrottle

Mehmonlar, IP manzil bo'yicha.

UserRateThrottle

Tizimga kirgan foydalanuvchilar.

ScopedRateThrottle

Alohida joy, masalan parolni tiklash.

Limit oshsa: 429 Too Many Requests. Throttlingsiz API brute-force va DDoS'ga ochiq.

Production limitlari

REST_FRAMEWORK = {
    "DEFAULT_THROTTLE_RATES": {
        "anon": "60/min",
        "user": "300/min",
        "login_anon": "5/min",
    },
}
0
mehmon limiti
0
foydalanuvchi limiti
0
login limiti
04

CORS, CSRF va inyeksiya

Brauzer va ma'lumot himoyasi

CORS: Same-Origin Policy

Frontendreact-loyiha.uz BrauzerSame-Origin Policy APIapi.loyiha.uz

Server brauzerga «react-loyiha.uz ga ruxsat beraman» deydi. Django: django-cors-headers.

CORS sozlamasi: xavfli va to'g'ri

CORS_ALLOW_ALL_ORIGINS = True
# productionda hech qachon!
CORS_ALLOWED_ORIGINS = os.getenv(
    "CORS_ALLOWED_ORIGINS", ""
).split(",")

CSRF hujumi qanday ishlaydi?

1. Siz bankka kirdingiz

Sessiya va cookie yaratildi.

2. Boshqa saytga o'tdingiz

Haker sahifasida yashirin forma bor.

3. Brauzer cookie yuboradi

Bank so'rovni qonuniy deb o'ylaydi!

4. Yechim: CSRF token

Har POST/PUT da tasodifiy token; haker uni bilmaydi.

Faqat JWT/Token ishlatsangiz CSRF muammo emas: brauzer tokenni o'zi yubormaydi.

Foydalanuvchi ma'lumotiga ishonmang

Never trust user input: foydalanuvchi yuborgan ma'lumotga hech qachon ishonmang.
name = "'; DROP TABLE users; --"
# qo'lda SQL ga yopishtirish: bazani o'chiradi
email = serializers.EmailField()
Post.objects.get(id=pk)  # ORM escaping

Serializer tekshiradi, ORM xavfli belgilarni zararsizlantiradi. Raw SQL dan qoching. XSS: izohga JavaScript yozish.

05

Productionga tayyorlash

Sozlamalar va checklist

prod.py: HTTPS va xavfsiz sarlavhalar

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"

Security checklist

Konfiguratsiya

DEBUG=False, ALLOWED_HOSTS, .env (sir kodda emas).

Transport

HTTPS, secure cookies, HSTS, faqat kerakli CORS originlar.

Auth va limit

JWT access qisqa, refresh rotate+blacklist, login throttling.

Fayl va log

Upload: MIME va hajm limiti; logging, security headers.

Mini-test

Foydalanuvchi qaysi tokenni har so'rovda yuboradi va u nega qisqa yashaydi?

Access token qisqa muddatli (5-15 daqiqa) va har so'rovda yuboriladi; refresh faqat yangilash uchun.

Odatiy xatolar

Payload'ga parol yozish; productionda CORS_ALLOW_ALL_ORIGINS = True; DEBUG = True qoldirish.
SECRET_KEY va DB parolini GitHub'ga yuklash; login uchun throttling qo'ymaslik.
To'g'ri: sirlar .env da, kerakli CORS originlar, qisqa access token, serializer validatsiyasi.

Amaliy topshiriq 20 daqiqa

OsonSimpleJWT sozlamasini settings/base.py ga kiriting.
O'rtaIsAuthor permissionini yozib, PostViewSet ga ulang. Boshqa user PATCH qilsa 403 ni tekshiring.
QiyinSecurity checklist bo'yicha loyihangizni tekshirib, 3 ta kamchilikni yozib chiqing va tuzating.
AXV

Xulosa

Xavfsizlik: ko'p qatlam, qisqa token, aniq CORS, ishonchsiz kiruvchi ma'lumot.

AuthenticationJWTPermissionsThrottling 429CORS / CSRFValidatsiya

Uyga vazifa: uyga-vazifa.md. Keyingi dars: tayyor loyihani hostingga joylash (deploy).