Məzmuna keç
Educora
İrəli20 dəq6 / 12

Veb təhlükəsizliyi: OWASP Top 10

Veb-tətbiqlərin ən kritik risklərini öyrən: SQL inyeksiyası və parametrli sorğular, XSS və ekranlaşdırma, CSRF, autentifikasiya xətaları və təhlükəsizlik başlıqları.

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

KodKateqoriyaNümunə
A01Pozulmuş giriş nəzarətiURL-də sifariş nömrəsini dəyişib başqasının sifarişini görmək
A02Kriptoqrafik xətalarhəssas məlumat şifrələnmədən ötürülür və ya saxlanır
A03İnyeksiyaistifadəçi mətni SQL və ya əmr kimi icra olunur; XSS də buraya aiddir
A04Təhlükəsiz olmayan dizaynparol bərpası yalnız «sevimli rəngin» sualına əsaslanır
A05Səhv konfiqurasiyastandart admin parolu, istifadəçiyə göstərilən ətraflı xəta mətnləri
A06Zəif və köhnə komponentlərməlum zəifliyi olan kitabxana versiyası
A07İdentifikasiya və autentifikasiya xətalarıparol yoxlamalarının sayı məhdudlaşdırılmayıb
A08Proqram və məlumat bütövlüyü xətalarıyeniləmələr imza yoxlanmadan quraşdırılır
A09Jurnal və monitorinq xətalarıhücum aylarla heç kimin diqqətini çəkmir
A10Server tərəfində sorğu saxtakarlığı (SSRF)server istifadəçinin verdiyi URL ilə daxili xidmətə müraciət edir
2021-ci il nəşri. OWASP siyahını bir neçə ildən bir yeniləyir — ən son variantı owasp.org saytında yoxla.

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

Zəif: sətir yapışdırılır
def find_user(conn, username):
    query = "SELECT id, email FROM users WHERE username = '" + username + "'"
    return conn.execute(query).fetchall()
Təhlükəsiz: parametrli sorğu
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.
Python
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,)]
Hətta hücum olmadan belə, adında apostrof olan real istifadəçi yapışdırılmış sorğunu sındırır. Bu, həmin qapının hücumçu üçün də açıq olduğunu göstərir.

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.

Python
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: &lt;script&gt;alert(&#x27;hi&#x27;)&lt;/script&gt; Nice lesson!
Ekranlaşdırılmış mətn səhifədə eynilə görünür, amma brauzer onu teq kimi yox, adi mətn kimi göstərir.

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ıqNə edir
Content-Security-Policyhansı 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-Securitybrauzerə sayta yalnız HTTPS ilə girməyi əmr edir (HSTS)
X-Content-Type-Options: nosniffbrauzerin faylın tipini «təxmin etməsini» qadağan edir
X-Frame-Options / frame-ancestorssaytın başqa saytda gizli çərçivəyə yerləşdirilməsinin (clickjacking) qarşısını alır
Set-Cookie: Secure; HttpOnly; SameSitekuki yalnız HTTPS ilə gedir, skript onu oxuya bilmir və başqa saytlardan gələn sorğulara qoşulmur
Tapşırıq

escapeHtml(text) funksiyasını yaz: &, <, >, " və ' simvollarını uyğun olaraq &amp;, &lt;, &gt;, &quot; və &#39; ilə əvəz etsin. Diqqət: & birinci əvəz olunmalıdır.

Tapşırıq · JavaScript
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('&lt;'));
▸ Gözlənilən nəticə
Tom &amp; Jerry
&lt;b&gt;bold&lt;/b&gt;
&lt;img src=&quot;x&quot; alt=&#39;y&#39;&gt;
&amp;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.

1 / 10
İstifadəçi URL-də order=1001-i order=1002 edib başqasının sifarişini görür. Bu hansı kateqoriyadır?