- OWASP Top 10 kateqoriyalarını tanımaq və nümunə ilə izah etmək
- Zəif SQL kodunu parametrli sorğu ilə düzəltmək
- XSS-in qarşısını çıxışın ekranlaşdırılması ilə almaq
- CSRF-ə qarşı müdafiəni və əsas təhlükəsizlik başlıqlarını seçmək
Elvin ilk saytını yazdı: giriş səhifəsi, şərhlər, profil. Dürüst istifadəçilər üçün hər şey mükəmməl işləyir. Veb təhlükəsizliyi isə başqa sualla maraqlanır: istifadəçi gözlənilməz məlumat göndərsə, nə olacaq? Bu sualın cavabları illər boyu OWASP icmasının siyahısında toplanıb.
OWASP Top 10
| Kod | Kateqoriya | Nümunə |
|---|---|---|
| A01 | Pozulmuş giriş nəzarəti | URL-də sifariş nömrəsini dəyişib başqasının sifarişini görmək |
| A02 | Kriptoqrafik xətalar | həssas məlumat şifrələnmədən ötürülür və ya saxlanır |
| A03 | İnyeksiya | istifadəçi mətni SQL və ya əmr kimi icra olunur; XSS də buraya aiddir |
| A04 | Təhlükəsiz olmayan dizayn | parol bərpası yalnız «sevimli rəngin» sualına əsaslanır |
| A05 | Səhv konfiqurasiya | standart admin parolu, istifadəçiyə göstərilən ətraflı xəta mətnləri |
| A06 | Zəif və köhnə komponentlər | məlum zəifliyi olan kitabxana versiyası |
| A07 | İdentifikasiya və autentifikasiya xətaları | parol yoxlamalarının sayı məhdudlaşdırılmayıb |
| A08 | Proqram və məlumat bütövlüyü xətaları | yeniləmələr imza yoxlanmadan quraşdırılır |
| A09 | Jurnal və monitorinq xətaları | hücum aylarla heç kimin diqqətini çəkmir |
| A10 | Server tərəfində sorğu saxtakarlığı (SSRF) | server istifadəçinin verdiyi URL ilə daxili xidmətə müraciət edir |
İnyeksiya: məlumat koda çevriləndə
SQL sorğusu istifadəçinin mətni ilə sətir kimi «yapışdırılanda» verilənlər bazası məlumatla əmri ayıra bilmir. Dırnaq işarəsi olan xüsusi hazırlanmış mətn sətri vaxtından əvvəl bağlayıb sorğuya öz şərtini, məsələn, həmişə doğru olan şərti əlavə edə bilər. Nəticədə parolsuz giriş və ya bütün cədvəlin sızması baş verir. Çarə parametrli sorğudur: SQL mətni və dəyərlər ayrıca göndərilir və dəyər heç vaxt kod kimi oxunmur.
def find_user(conn, username):
query = "SELECT id, email FROM users WHERE username = '" + username + "'"
return conn.execute(query).fetchall()def find_user(conn, username):
query = 'SELECT id, email FROM users WHERE username = ?'
return conn.execute(query, (username,)).fetchall()? yer tutucudur: sürücü dəyəri ayrıca ötürür, ona görə dəyərdəki dırnaqlar sorğunun quruluşunu dəyişə bilmir.import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE users (id INTEGER, username TEXT)')
conn.executemany('INSERT INTO users VALUES (?, ?)', [(1, 'aysel'), (2, "o'neil")])
name = "o'neil" # a real surname with an apostrophe
try:
conn.execute("SELECT id FROM users WHERE username = '" + name + "'").fetchall()
except sqlite3.OperationalError as error:
print('String building failed:', error)
rows = conn.execute('SELECT id FROM users WHERE username = ?', (name,)).fetchall()
print('Parameterised query:', rows)▸ Gözlənilən nəticə
String building failed: near "neil": syntax error Parameterised query: [(2,)]
XSS: brauzerdə yad skript
Saytlararası skriptinq (XSS) o zaman baş verir ki, istifadəçinin mətni səhifəyə ekranlaşdırılmadan qoyulur və digər ziyarətçilərin brauzeri onu kod kimi icra edir. Belə skript seans kukisini oğurlaya və ya qurbanın adından əməliyyat edə bilər. Müdafiə: çıxışı kontekstə uyğun ekranlaşdırmaq (avtomatik ekranlaşdıran şablonlar), Content-Security-Policy başlığı və HttpOnly kukilər.
import html
comment = "<script>alert('hi')</script> Nice lesson!"
print('Raw: ', comment)
print('Escaped:', html.escape(comment))▸ Gözlənilən nəticə
Raw: <script>alert('hi')</script> Nice lesson!
Escaped: <script>alert('hi')</script> Nice lesson!CSRF və autentifikasiya xətaları
CSRF (saytlararası sorğu saxtakarlığı): istifadəçi bank saytına daxil olub, sonra başqa sayta keçir, o sayt isə gizlicə banka forma göndərir. Brauzer bank kukisini avtomatik əlavə etdiyi üçün sorğu qurbanın adından icra olunur. Müdafiə: hər formada serverin yoxladığı təsadüfi anti-CSRF tokeni, SameSite=Lax və ya Strict kukilər, Origin başlığının yoxlanması və vacib əməliyyatlar üçün təkrar təsdiq.
Autentifikasiya xətaları isə cəhdlərin sayının məhdudlaşdırılmaması (sızmış parolların kütləvi yoxlanması məhz belə işləyir), zəif parollara icazə, girişdən sonra seans identifikatorunun dəyişməməsi və çıxışda seansın bağlanmamasıdır. Çarə: sorğu limitləri, MFA, Secure və HttpOnly kukilər, girişdən sonra yeni seans.
Təhlükəsizlik başlıqları
| Başlıq | Nə edir |
|---|---|
| Content-Security-Policy | hansı mənbələrdən skript, stil və şəkil yüklənə biləcəyini müəyyən edir — XSS-ə qarşı ikinci sədd |
| Strict-Transport-Security | brauzerə sayta yalnız HTTPS ilə girməyi əmr edir (HSTS) |
| X-Content-Type-Options: nosniff | brauzerin faylın tipini «təxmin etməsini» qadağan edir |
| X-Frame-Options / frame-ancestors | saytın başqa saytda gizli çərçivəyə yerləşdirilməsinin (clickjacking) qarşısını alır |
| Set-Cookie: Secure; HttpOnly; SameSite | kuki yalnız HTTPS ilə gedir, skript onu oxuya bilmir və başqa saytlardan gələn sorğulara qoşulmur |
escapeHtml(text) funksiyasını yaz: &, <, >, " və ' simvollarını uyğun olaraq &, <, >, " və ' ilə əvəz etsin. Diqqət: & birinci əvəz olunmalıdır.
function escapeHtml(text) {
// replace & first, then < > " '
return text;
}
console.log(escapeHtml('Tom & Jerry'));
console.log(escapeHtml('<b>bold</b>'));
console.log(escapeHtml(`<img src="x" alt='y'>`));
console.log(escapeHtml('<'));▸ Gözlənilən nəticə
Tom & Jerry <b>bold</b> <img src="x" alt='y'> &lt;
Əsas fikirlər
- OWASP Top 10 veb-tətbiqlərin ən kritik risklərinin siyahısıdır; birinci yerdə pozulmuş giriş nəzarətidir.
- SQL inyeksiyasına qarşı yeganə etibarlı çarə parametrli sorğulardır.
- XSS-ə qarşı çıxış kontekstə uyğun ekranlaşdırılır, CSP isə ikinci sədd yaradır.
- CSRF-ə qarşı anti-CSRF tokeni və SameSite kukilər işləyir.
- Təhlükəsizlik başlıqları (CSP, HSTS, nosniff, frame-ancestors) ucuz, amma güclü müdafiədir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
order=1001-i order=1002 edib başqasının sifarişini görür. Bu hansı kateqoriyadır?