
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:
# INSECURE: No authorization check
@app.route('/api/users/<user_id>/profile')
def get_profile(user_id):
# Any authenticated user can access ANY user's profile
user = User.query.get(user_id)
return jsonify(user.to_dict())
# INSECURE: Client-side role check only
@app.route('/api/admin/users')
def admin_users():
# Only checking role in frontend JavaScript, not backend
return jsonify([u.to_dict() for u in User.query.all()])Düzeltilmiş kod:
# SECURE: Proper authorization
@app.route('/api/users/<user_id>/profile')
@login_required
def get_profile(user_id):
# Users can only access their own profile
if str(current_user.id) != user_id and not current_user.is_admin:
abort(403)
user = User.query.get_or_404(user_id)
return jsonify(user.to_dict())
# SECURE: Server-side role verification
@app.route('/api/admin/users')
@login_required
@require_role('admin')
def admin_users():
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:
# INSECURE: MD5 for password hashing
import hashlib
password_hash = hashlib.md5(password.encode()).hexdigest()
# INSECURE: Hardcoded secret key
SECRET_KEY = "my-super-secret-key-123"
# INSECURE: HTTP for sensitive data
API_URL = "http://api.example.com/payments"Düzeltilmiş kod:
# SECURE: bcrypt with salt
from bcrypt import hashpw, gensalt, checkpw
password_hash = hashpw(password.encode(), gensalt(rounds=12))
# SECURE: Environment variable for secrets
import os
SECRET_KEY = os.environ["SECRET_KEY"]
# SECURE: HTTPS enforced
API_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:
# INSECURE: String concatenation in SQL
@app.route('/api/search')
def search():
query = request.args.get('q')
# Attacker sends: q='; DROP TABLE users; --
results = db.execute(
f"SELECT * FROM products WHERE name LIKE '%{query}%'"
)
return jsonify(results)
# SECURE: Parameterized query
@app.route('/api/search')
def search():
query = request.args.get('q', '')
results = db.execute(
"SELECT * FROM products WHERE name LIKE :query",
{"query": f"%{query}%"}
)
return jsonify(results)NoSQL Enjeksiyon (MongoDB):
// INSECURE: Direct user input in query
app.post('/api/login', (req, res) => {
// Attacker sends: {"username": {"$gt": ""}, "password": {"$gt": ""}}
User.findOne({
username: req.body.username,
password: req.body.password
});
});
// SECURE: Input validation + sanitization
app.post('/api/login', (req, res) => {
const username = String(req.body.username);
const password = String(req.body.password);
User.findOne({ username })
.then(user => bcrypt.compare(password, user.passwordHash));
});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ı
Common Misconfigurations:
☐ Default credentials on admin panels (admin/admin)
☐ Unnecessary HTTP methods enabled (PUT, DELETE, TRACE)
☐ Directory listing enabled on web server
☐ Stack traces exposed in error responses
☐ Cloud storage buckets publicly accessible (S3, GCS)
☐ CORS set to Access-Control-Allow-Origin: *
☐ Debug mode enabled in production
☐ 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ı:
# Nginx security headers
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "0" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_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:
# npm audit — check Node.js dependencies
npm audit
npm audit fix
# pip-audit — check Python dependencies
pip install pip-audit
pip-audit
# Snyk — multi-language vulnerability scanner
snyk test
snyk monitor # continuous monitoring
# GitHub Dependabot — automatic PRs for vulnerable dependencies
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
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
Secure Development Lifecycle (SDL):
Requirements → Threat Modeling (A04: Insecure Design)
│
Design → Security Architecture Review
│
Development → SAST scanning, secure coding standards
│
Testing → DAST scanning, penetration testing
│
Deployment → Security hardening, dependency scanning
│
Operations → WAF, monitoring, incident response
│
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


