Məzmuna keç
Educora
İrəli18 dəq7 / 12

Təhlükəsiz kod yazma

Dörd əsas vərdiş: girişi icazə siyahısı ilə yoxlamaq, minimal imtiyaz prinsipi, sirləri koddan kənarda saxlamaq və asılılıqlardakı zəiflikləri izləmək.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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.

Qara siyahı: həmişə natamamdır
BAD = ['<script>', 'DROP TABLE', '--']

def is_safe(text):
    return not any(bad in text for bad in BAD)

is_safe('<SCRIPT>')   # True - uppercase slips through
İcazə siyahısı: yalnız düzgün olan keçir
import re

def is_valid_username(text):
    return re.fullmatch(r'[a-z0-9_]{3,16}', text) is not None

is_valid_username('<SCRIPT>')   # False
Hücumçu qara siyahıdan yan keçmək üçün minlərlə variant tapa bilər; icazə siyahısında isə yalnız sənin təsvir etdiyin format qəbul olunur.
Python
import 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']
Funksiya bütün xətaları birdən qaytarır ki, istifadəçi formanı bir dəfəyə düzəldə bilsin. 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.

Hər şeyə, hər yerdən
GRANT ALL PRIVILEGES ON *.* TO 'shop_app'@'%';
Yalnız lazım olan, yalnız daxili şəbəkədən
GRANT SELECT, INSERT, UPDATE ON shop.orders TO 'shop_app'@'10.0.0.%';
GRANT SELECT ON shop.products TO 'shop_app'@'10.0.0.%';
MySQL nümunəsi: sındırılmış tətbiq 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.

Sirr kodun içində
DB_PASSWORD = 'Baku2024!'   # now in Git history forever

connect(user='shop_app', password=DB_PASSWORD)
Sirr mühitdən gəlir
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,9Aşağınövbəti planlı yeniləmədə düzəlt
4,0–6,9Ortayaxın həftələrdə düzəlt
7,0–8,9Yüksəkprioritetlə, günlər ərzində düzəlt
9,0–10,0Kritikdərhal yenilə və ya müvəqqəti müdafiə qur
Dərəcələr CVSS v3 şkalası üzrədir; son qərar sistemində həmin komponentin həqiqətən əlçatan olub-olmamasından da asılıdır.
Terminal
# JavaScript project: check dependencies against known vulnerabilities
npm audit

# Python project
pip install pip-audit
pip-audit
Bu əmrləri öz layihəndə işə sal və tapılan zəiflikləri CVSS balına görə sırala.
Tapşırıq

Sifariş 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.

Tapşırıq · Python
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.

1 / 10
Niyə qara siyahı ilə yoxlama etibarsız sayılır?