- Girişi serverdə icazə siyahısı ilə yoxlayan kod yazmaq
- Minimal imtiyaz prinsipini verilənlər bazası və xidmətlərə tətbiq etmək
- Sirləri koddan çıxarmaq və sızma zamanı düzgün hərəkət etmək
- CVE, CVSS və asılılıq auditi alətlərini başa düşmək
Zəifliklərin çoxu ekzotik hiylələrdən yox, adi proqramçı vərdişlərindən yaranır: girişə etibar etmək, xidməti administrator hüququ ilə işə salmaq, parolu Git anbarına yazmaq, üç ildir yenilənməyən kitabxana. Bu dərsdə hər gün kodu daha təhlükəsiz edən dörd vərdişi öyrənəcəksən.
1. Girişin yoxlanması: icazə siyahısı
Hər giriş etibarsızdır: formalar, URL parametrləri, başlıqlar, kukilər, yüklənən fayllar, hətta öz mobil tətbiqindən gələn sorğular (onları dəyişmək olar). Yoxlama serverdə aparılmalıdır; brauzerdəki yoxlama yalnız istifadəçinin rahatlığı üçündür. Tipi, uzunluğu, diapazonu və formatı yoxla, pis simvolları axtarmaq əvəzinə nəyin düzgün olduğunu təsvir et.
BAD = ['<script>', 'DROP TABLE', '--']
def is_safe(text):
return not any(bad in text for bad in BAD)
is_safe('<SCRIPT>') # True - uppercase slips throughimport re
def is_valid_username(text):
return re.fullmatch(r'[a-z0-9_]{3,16}', text) is not None
is_valid_username('<SCRIPT>') # Falseimport re
USERNAME = re.compile(r'[a-z0-9_]{3,16}')
def validate_signup(username, age):
errors = []
if not USERNAME.fullmatch(username):
errors.append('username: 3-16 of a-z 0-9 _')
if not (type(age) is int and 10 <= age <= 120):
errors.append('age: whole number 10-120')
return errors or ['OK']
for username, age in [('aysel_07', 15), ('Murad!', 16), ('elvin', -3), ('x', 200)]:
print(username.ljust(9), validate_signup(username, age))▸ Gözlənilən nəticə
aysel_07 ['OK'] Murad! ['username: 3-16 of a-z 0-9 _'] elvin ['age: whole number 10-120'] x ['username: 3-16 of a-z 0-9 _', 'age: whole number 10-120']
fullmatch bütün sətrin formata uyğun olmasını tələb edir.2. Minimal imtiyaz prinsipi
Hər istifadəçi, proses və xidmət yalnız işi üçün lazım olan hüquqları, yalnız lazım olan müddətə almalıdır. Veb-tətbiqin verilənlər bazası hesabı administrator olmamalıdır, xidmətlər root və ya Administrator adından işləməməlidir, admin işləri üçün ayrıca hesab olmalıdır. Tətbiq sındırılsa belə, ziyanın radiusu kiçik qalır.
GRANT ALL PRIVILEGES ON *.* TO 'shop_app'@'%';GRANT SELECT, INSERT, UPDATE ON shop.orders TO 'shop_app'@'10.0.0.%';
GRANT SELECT ON shop.products TO 'shop_app'@'10.0.0.%';DROP DATABASE icra edə və ya başqa bazaları oxuya bilməz, çünki bu hüquqlar ona verilməyib.Bu prinsipin iki yaxın «qohumu» var. Təhlükəsiz standart parametrlər: yeni hesab, yeni fayl və yeni API açarı əvvəlcə heç nəyə icazə vermir, hüquqlar sonradan şüurlu şəkildə əlavə olunur. Qapalı vəziyyətdə dayanmaq (fail closed): yoxlama xəta ilə bitəndə, məsələn, icazə serveri cavab vermədikdə, kod girişi rədd etməlidir, «hər ehtimala qarşı» buraxmamalıdır.
3. Sirlərin idarə edilməsi
Parollar, API açarları, tokenlər və gizli açarlar heç vaxt kodda saxlanmır. Git tarixçəsi silinmiş faylı da əbədi yadda saxlayır, robotlar isə açıq anbarlarda açar axtarır. Sirləri mühit dəyişənlərində və ya sirr menecerində (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) saxla, .env faylını .gitignore-a əlavə et və kommitdən əvvəl sirr skanerindən (məsələn, gitleaks) istifadə et.
DB_PASSWORD = 'Baku2024!' # now in Git history forever
connect(user='shop_app', password=DB_PASSWORD)import os
DB_PASSWORD = os.environ['DB_PASSWORD'] # set by the server or a secrets manager
connect(user='shop_app', password=DB_PASSWORD)4. Asılılıqlardakı zəifliklər
Müasir tətbiqin kodunun böyük hissəsi başqalarının kitabxanalarıdır. Məlum zəiflik CVE identifikatoru və CVSS balı (0–10) alır. npm audit, pip-audit, Dependabot və OWASP Dependency-Check kimi alətlər asılılıqlarını bu bazalarla müqayisə edir. Kilid faylları (package-lock.json, poetry.lock) dəqiq versiyaları sabitləyir, SBOM isə bütün komponentlərin siyahısını verir. Məşhur paketə oxşar adlı saxta paketlərə (typosquatting) də diqqət et.
| CVSS balı | Dərəcə | Nə etməli |
|---|---|---|
| 0,1–3,9 | Aşağı | növbəti planlı yeniləmədə düzəlt |
| 4,0–6,9 | Orta | yaxın həftələrdə düzəlt |
| 7,0–8,9 | Yüksək | prioritetlə, günlər ərzində düzəlt |
| 9,0–10,0 | Kritik | dərhal yenilə və ya müvəqqəti müdafiə qur |
# JavaScript project: check dependencies against known vulnerabilities
npm audit
# Python project
pip install pip-audit
pip-auditSifariş formasındakı «miqdar» sahəsi üçün is_valid_quantity(text) funksiyasını yaz: yalnız 1-dən 99-a qədər tam ədədi göstərən sətirlər ([0-9] rəqəmləri, 1–2 simvol) True qaytarsın. Boşluq, mənfi işarə, 5e3 və ² kimi simvollar rədd edilməlidir və funksiya heç vaxt xəta verməməlidir.
import re
def is_valid_quantity(text):
# allow-list: 1-2 ASCII digits, value 1..99
return False
for value in ['3', '99', '0', '100', '-1', ' 7', '5e3', '²']:
print(repr(value), is_valid_quantity(value))▸ Gözlənilən nəticə
'3' True '99' True '0' False '100' False '-1' False ' 7' False '5e3' False '²' False
Əsas fikirlər
- Hər girişi serverdə icazə siyahısı ilə yoxla: tip, uzunluq, diapazon, format.
- Yoxlama parametrli sorğuları və ekranlaşdırmanı əvəz etmir.
- Minimal imtiyaz sındırılmış komponentin vura biləcəyi ziyanı məhdudlaşdırır.
- Sirlər kodda yox, mühitdə və ya sirr menecerində saxlanır; sızan sirr dərhal dəyişdirilir.
- Asılılıqları audit alətləri ilə yoxla, CVSS balına görə prioritet ver və SBOM saxla.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.