
Her Geliştiricinin OWASP Top 10'u Bilmesi Neden Önemli?
OWASP Top 10, web uygulama güvenlik riskleri için en yaygın referans alınan standarttır. Açık Web Uygulama Güvenliği Projesi (OWASP) tarafından yayınlanan bu liste, web uygulamalarına yönelik en kritik güvenlik tehditleri konusunda geniş bir uzlaşıyı temsil eder. İnternete dokunan yazılım geliştiriyorsanız, bu zafiyetleri anlamak isteğe bağlı değil—zorunludur.
Güncel liste (2021, 2025 güncellemesi devam ediyor) sadece uygulama hatalarına değil, tasarım kusurlarına ve mimari zayıflıklara doğru belirgin bir kayma gösteriyor.
OWASP Top 10 (2021)
| # | Risk | Description | Moved From |
|---|---|---|---|
| A01 | Broken Access Control | Users act outside intended permissions | #5 → #1 |
| A02 | Cryptographic Failures | Sensitive data exposure through weak crypto | #3 → #2 |
| A03 | Injection | SQL, NoSQL, OS, LDAP injection | #1 → #3 |
| A04 | Insecure Design | Missing security architecture and design patterns | New |
| A05 | Security Misconfiguration | Default configs, open cloud storage, verbose errors | #6 → #5 |
| A06 | Vulnerable Components | Using components with known vulnerabilities | #9 → #6 |
| A07 | Auth Failures | Broken authentication and session management | #2 → #7 |
| A08 | Software & Data Integrity | Code and infrastructure without integrity verification | New |
| A09 | Security Logging Failures | Insufficient logging and monitoring | #10 → #9 |
| A10 | SSRF | Server-Side Request Forgery | New |
Dikkat çekici değişiklikler: Enjeksiyon zafiyetleri on yıldan fazla süre birinci sırada kaldıktan sonra 3. sıraya geriledi. Bunun yerine Bozuk Erişim Kontrolü birinci sıraya yükseldi—test edilen uygulamaların %94'ünde erişim kontrolü sorunu tespit edildi. Ayrıca Güvensiz Tasarım ve SSRF gibi kategoriler listeye ilk kez girdi.
A01: Bozuk Erişim Kontrolü
1 numaralı risk. Test edilen uygulamaların %94'ünde bir tür erişim kontrolü sorunu bulundu.
Zafiyetli kod:
1# INSECURE: No authorization check
2@app.route('/api/users/<user_id>/profile')
3def get_profile(user_id):
4 # Any authenticated user can access ANY user's profile
5 user = User.query.get(user_id)
6 return jsonify(user.to_dict())
7
8# INSECURE: Client-side role check only
9@app.route('/api/admin/users')
10def admin_users():
11 # Only checking role in frontend JavaScript, not backend
12 return jsonify([u.to_dict() for u in User.query.all()])Düzeltilmiş kod:
1# SECURE: Proper authorization
2@app.route('/api/users/<user_id>/profile')
3@login_required
4def get_profile(user_id):
5 # Users can only access their own profile
6 if str(current_user.id) != user_id and not current_user.is_admin:
7 abort(403)
8 user = User.query.get_or_404(user_id)
9 return jsonify(user.to_dict())
10
11# SECURE: Server-side role verification
12@app.route('/api/admin/users')
13@login_required
14@require_role('admin')
15def admin_users():
16 return jsonify([u.to_dict() for u in User.query.all()])Yaygın erişim kontrolü sorunları:
- IDOR (Güvensiz Doğrudan Nesne Referansı): URL'deki
/api/orders/123değerini/api/orders/124yaparak başka bir kullanıcının siparişine erişmek - Yetki yükseltme: Normal kullanıcının yönetici uç noktalarına erişmesi
- Fonksiyon düzeyinde erişim kontrolü eksikliği: API uç noktaları yetki kontrolü olmadan doğrudan erişilebilir
- CORS yanlış yapılandırması: Yetkisiz kaynaklara izin veren origin yapılandırması
A02: Kriptografik Hatalar
Zafiyetli örüntüler:
1# INSECURE: MD5 for password hashing
2import hashlib
3password_hash = hashlib.md5(password.encode()).hexdigest()
4
5# INSECURE: Hardcoded secret key
6SECRET_KEY = "my-super-secret-key-123"
7
8# INSECURE: HTTP for sensitive data
9API_URL = "http://api.example.com/payments"Düzeltilmiş kod:
1# SECURE: bcrypt with salt
2from bcrypt import hashpw, gensalt, checkpw
3password_hash = hashpw(password.encode(), gensalt(rounds=12))
4
5# SECURE: Environment variable for secrets
6import os
7SECRET_KEY = os.environ["SECRET_KEY"]
8
9# SECURE: HTTPS enforced
10API_URL = "https://api.example.com/payments"Parola hash'leme konusunda MD5 ve SHA-1 kesinlikle kullanılmamalıdır—bu algoritmalar hız için optimize edilmiştir, oysa parola hash'leme kasıtlı olarak yavaş olmalıdır. bcrypt, scrypt veya Argon2 tercih edilmelidir. Gizli anahtarlar asla kaynak kodunda tutulmamalı, ortam değişkenleri veya sır yönetim araçları kullanılmalıdır.
A03: Enjeksiyon
Enjeksiyon 1. sıradan 3. sıraya geriledi ancak hâlâ tehlikeli. Modern çatılar büyük ölçüde koruma sağlıyor, fakat ham sorgular hâlâ üretim kodlarında karşımıza çıkıyor.
SQL Enjeksiyon örneği:
1# INSECURE: String concatenation in SQL
2@app.route('/api/search')
3def search():
4 query = request.args.get('q')
5 # Attacker sends: q='; DROP TABLE users; --
6 results = db.execute(
7 f"SELECT * FROM products WHERE name LIKE '%{query}%'"
8 )
9 return jsonify(results)
10
11# SECURE: Parameterized query
12@app.route('/api/search')
13def search():
14 query = request.args.get('q', '')
15 results = db.execute(
16 "SELECT * FROM products WHERE name LIKE :query",
17 {"query": f"%{query}%"}
18 )
19 return jsonify(results)NoSQL Enjeksiyon (MongoDB):
1// INSECURE: Direct user input in query
2app.post('/api/login', (req, res) => {
3 // Attacker sends: {"username": {"$gt": ""}, "password": {"$gt": ""}}
4 User.findOne({
5 username: req.body.username,
6 password: req.body.password
7 });
8});
9
10// SECURE: Input validation + sanitization
11app.post('/api/login', (req, res) => {
12 const username = String(req.body.username);
13 const password = String(req.body.password);
14 User.findOne({ username })
15 .then(user => bcrypt.compare(password, user.passwordHash));
16});Temel kural basittir: kullanıcı girdisine asla güvenme. ORM ve parametrelendirilmiş sorgular kullanmak, enjeksiyon saldırılarının büyük çoğunluğunu engeller. Ancak dinamik sorgu oluşturmanın gerekli olduğu durumlarda bile girdi doğrulaması ve parametrelendirme zorunludur.
A04: Güvensiz Tasarım
2021'de listeye yeni eklendi. Bu, uygulama hatalarıyla ilgili değil—tasarım aşamasında tehdit modellemesi ve güvenlik örüntülerinin eksikliğiyle ilgili.
Örnek: Bir e-ticaret sitesi, 4 haneli bir kodla sınırsız parola sıfırlama denemesine izin veriyor. IP başına hız sınırlama olsa bile, bir botnet'e sahip saldırgan herhangi bir hesabı kaba kuvvetle ele geçirebilir.
Güvenli tasarım ilkeleri:
- Mimari aşamasında tehdit modellemesi (STRIDE, PASTA)
- Güvenli tasarım örüntüleri kütüphanesi (referans mimariler)
- "Asfaltlı yol" yaklaşımı: Güvenli yolu geliştiriciler için kolay yap
- Fonksiyonel testlerin yanında kötüye kullanım senaryosu testleri
A05: Güvenlik Yanlış Yapılandırması
1Common Misconfigurations:
2
3☐ Default credentials on admin panels (admin/admin)
4☐ Unnecessary HTTP methods enabled (PUT, DELETE, TRACE)
5☐ Directory listing enabled on web server
6☐ Stack traces exposed in error responses
7☐ Cloud storage buckets publicly accessible (S3, GCS)
8☐ CORS set to Access-Control-Allow-Origin: *
9☐ Debug mode enabled in production
10☐ Default security headers missingYanlış yapılandırma sorunları defalarca büyük veri ihlallerine yol açmıştır. Herkese açık S3 bucket'ları milyonlarca kullanıcının verilerini ifşa etmiş, üretim ortamında açık kalan debug modları iç yapıyı saldırganlara sergilemiş, varsayılan admin kimlik bilgileri kritik sistemlere yetkisiz erişim sağlamıştır.
Her uygulamanın ayarlaması gereken güvenlik başlıkları:
1# Nginx security headers
2add_header X-Content-Type-Options "nosniff" always;
3add_header X-Frame-Options "DENY" always;
4add_header X-XSS-Protection "0" always;
5add_header Referrer-Policy "strict-origin-when-cross-origin" always;
6add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
7add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
8add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;A06: Zafiyetli ve Güncelliğini Yitirmiş Bileşenler
Kod tabanlarının %78'i üçüncü taraf bağımlılıklarında en az bir zafiyet içeriyor. Otomatik tarama vazgeçilmezdir:
1# npm audit — check Node.js dependencies
2npm audit
3npm audit fix
4
5# pip-audit — check Python dependencies
6pip install pip-audit
7pip-audit
8
9# Snyk — multi-language vulnerability scanner
10snyk test
11snyk monitor # continuous monitoring
12
13# GitHub Dependabot — automatic PRs for vulnerable dependencies
14# .github/dependabot.yml
15version: 2
16updates:
17 - package-ecosystem: "npm"
18 directory: "/"
19 schedule:
20 interval: "weekly"Log4Shell zafiyeti (Log4j) bu riskin ne kadar yıkıcı olabileceğinin çarpıcı bir örneğiydi: yaygın kullanılan tek bir kütüphanedeki zafiyet milyonlarca Java uygulamasını etkiledi. Bağımlılıkları düzenli olarak taramak, güncellemek ve SBOM (Yazılım Malzeme Listesi) tutmak artık isteğe bağlı değildir.
A07-A10: Diğer Riskler
A07 - Kimlik Doğrulama Hataları: Zayıf parolalar, MFA eksikliği, kimlik bilgisi doldurma saldırıları. Özel uygulamalar yerine kanıtlanmış kütüphaneler (Passport.js, Django auth, NextAuth) kullanın.
A08 - Yazılım ve Veri Bütünlüğü: Doğrulanmamış CI/CD iş hatları, imzasız güncellemeler, serileştirme çözme (deserialization) saldırıları. Kod ve verilerin bütünlüğünü her zaman imzalar ve sağlama toplamları ile doğrulayın.
A09 - Güvenlik Günlükleme Hataları: Bir ihlali algılayamıyorsanız, müdahale de edemezsiniz. Kimlik doğrulama olaylarını, erişim kontrolü hatalarını, girdi doğrulama hatalarını ve uygulama hatalarını günlükleyin.
A10 - SSRF (Sunucu Taraflı İstek Sahteciliği): Sunucu, saldırgan adına isteklerde bulunur. Bulut metadata uç noktaları (169.254.169.254) başlıca hedeflerdir. Tüm URL'leri doğrulayın ve temizleyin, izin listeleri kullanın.
OWASP'ı Geliştirme Sürecinize Entegre Etmek
1Secure Development Lifecycle (SDL):
2
3 Requirements → Threat Modeling (A04: Insecure Design)
4 │
5 Design → Security Architecture Review
6 │
7 Development → SAST scanning, secure coding standards
8 │
9 Testing → DAST scanning, penetration testing
10 │
11 Deployment → Security hardening, dependency scanning
12 │
13 Operations → WAF, monitoring, incident response
14 │
15 Review → Lessons learned, update threat modelOWASP Top 10, tamamlanacak bir kontrol listesi değil—uygulama güvenliği hakkında düşünmek için bir çerçevedir. Bu riskleri geliştirme kültürüne içselleştiren kuruluşlar, daha dayanıklı yazılımlar üretir. Güvenlik, geliştirme sürecinin sonuna eklenen bir katman değil, başından itibaren tasarımın parçası olmalıdır.
Kaynaklar: OWASP Top 10 (2021), OWASP Testing Guide, OWASP Cheat Sheet Series


