Insecure Direct Object References (IDOR) Saldırılarını Önleme
Merhaba değerli okuyucular! Bugün, web uygulamalarında sıkça karşılaşılan ve ciddi güvenlik açıklarına yol açabilen Insecure Direct Object References (IDOR) saldırılarını ve bunları nasıl önleyebileceğimizi derinlemesine inceleyeceğiz. IDOR'un ne olduğunu, nasıl tespit edileceğini ve etkili önleme yöntemlerini ele alacağız. Hazırsanız, IDOR güvenliğinin derinliklerine dalalım!
IDOR Nedir?
IDOR, bir kullanıcının, erişim yetkisi olmayan nesnelere doğrudan erişebilmesine olanak tanıyan bir güvenlik açığıdır. Bu, genellikle kullanıcı girdisinin yetersiz doğrulanması sonucu ortaya çıkar.
IDOR Örneği:
// Güvensiz kod örneği app.get('/api/users/:id', (req, res) => { const userId = req.params.id; const user = db.getUser(userId); res.json(user); });
Bu örnekte, bir kullanıcı kendi ID'si dışındaki ID'leri deneyerek başka kullanıcıların bilgilerine erişebilir.
IDOR Saldırılarını Tespit Etme
- Endpoint'leri ve parametreleri analiz edin
- Farklı kullanıcı hesaplarıyla test yapın
- ID manipülasyonu deneyin
- Otomatik tarama araçları kullanın
IDOR Saldırılarını Önleme Yöntemleri
1. Yetkilendirme Kontrolleri
Her istek için kullanıcının yetkisini kontrol edin:
function isAuthorized(userId, resourceId) { // Kullanıcının bu kaynağa erişim yetkisi var mı kontrol et // Örneğin: Kullanıcının kendi profili mi, yönetici mi, vb. return userHasPermission(userId, resourceId); } app.get('/api/users/:id', (req, res) => { const requestedUserId = req.params.id; const currentUserId = req.user.id; // Oturum açmış kullanıcının ID'si if (!isAuthorized(currentUserId, requestedUserId)) { return res.status(403).json({ error: 'Yetkisiz erişim' }); } const user = db.getUser(requestedUserId); res.json(user); });
2. Dolaylı Nesne Referansları Kullanın
Doğrudan ID'ler yerine, geçici ve kullanıcıya özel referanslar kullanın:
const uuidv4 = require('uuid').v4; const referenceMap = new Map(); function createReference(userId, resourceId) { const reference = uuidv4(); referenceMap.set(reference, { userId, resourceId }); return reference; } function resolveReference(reference, currentUserId) { const resource = referenceMap.get(reference); if (!resource || resource.userId !== currentUserId) { return null; } return resource.resourceId; } app.get('/api/resource/:reference', (req, res) => { const currentUserId = req.user.id; const resourceId = resolveReference(req.params.reference, currentUserId); if (!resourceId) { return res.status(404).json({ error: 'Kaynak bulunamadı' }); } const resource = db.getResource(resourceId); res.json(resource); });
3. Rol Tabanlı Erişim Kontrolü (RBAC)
Kullanıcı rollerine dayalı erişim kontrolleri uygulayın:
const ROLES = { USER: 'user', ADMIN: 'admin' }; function checkRole(requiredRole) { return (req, res, next) => { if (req.user.role !== requiredRole) { return res.status(403).json({ error: 'Yetkisiz erişim' }); } next(); }; } app.get('/api/users', checkRole(ROLES.ADMIN), (req, res) => { const users = db.getAllUsers(); res.json(users); });
4. Veri Filtreleme
Kullanıcıya döndürülen verileri filtreleyerek hassas bilgileri koruyun:
function filterUserData(user, requestingUserId) { if (user.id !== requestingUserId && !isAdmin(requestingUserId)) { return { id: user.id, name: user.name, // Hassas bilgileri çıkar }; } return user; } app.get('/api/users/:id', (req, res) => { const requestedUserId = req.params.id; const currentUserId = req.user.id; const user = db.getUser(requestedUserId); const filteredUser = filterUserData(user, currentUserId); res.json(filteredUser); });
5. Rate Limiting
Otomatize IDOR saldırılarını engellemek için rate limiting uygulayın:
const rateLimit = require("express-rate-limit"); const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 dakika max: 100 // Her IP için 15 dakikada maksimum 100 istek }); app.use("/api/", apiLimiter);
6. Parametre Şifreleme
Hassas parametreleri şifreleyerek tahmin edilmesini zorlaştırın:
const crypto = require('crypto'); function encryptParameter(param, secret) { const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(secret), iv); let encrypted = cipher.update(param); encrypted = Buffer.concat([encrypted, cipher.final()]); return iv.toString('hex') + ':' + encrypted.toString('hex'); } function decryptParameter(encryptedParam, secret) { const parts = encryptedParam.split(':'); const iv = Buffer.from(parts.shift(), 'hex'); const encryptedText = Buffer.from(parts.join(':'), 'hex'); const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(secret), iv); let decrypted = decipher.update(encryptedText); decrypted = Buffer.concat([decrypted, decipher.final()]); return decrypted.toString(); } app.get('/api/resource/:encryptedId', (req, res) => { const secret = process.env.ENCRYPTION_SECRET; const decryptedId = decryptParameter(req.params.encryptedId, secret); // İşleme devam et... });
IDOR Güvenlik Kontrol Listesi
IDOR saldırılarına karşı uygulamanızın güvenliğini sağlamak için bu kontrol listesini kullanabilirsiniz:
class IDORSecurityChecker { constructor() { this.checks = { authorizationCheck: false, indirectReferences: false, rbacImplemented: false, dataFiltering: false, rateLimitingApplied: false, parameterEncryption: false }; } implementAuthorizationCheck() { // Yetkilendirme kontrol mantığı this.checks.authorizationCheck = true; } useIndirectReferences() { // Dolaylı referans kullanım mantığı this.checks.indirectReferences = true; } implementRBAC() { // RBAC uygulama mantığı this.checks.rbacImplemented = true; } applyDataFiltering() { // Veri filtreleme mantığı this.checks.dataFiltering = true; } applyRateLimiting() { // Rate limiting uygulama mantığı this.checks.rateLimitingApplied = true; } useParameterEncryption() { // Parametre şifreleme mantığı this.checks.parameterEncryption = true; } isSecure() { return Object.values(this.checks).every(check => check === true); } generateReport() { console.log("IDOR Güvenlik Raporu:"); for (const [check, implemented] of Object.entries(this.checks)) { console.log(`${check}: ${implemented ? 'Uygulandı' : 'Uygulanmadı'}`); } console.log(`Genel Güvenlik Durumu: ${this.isSecure() ? 'Güvenli' : 'İyileştirme Gerekiyor'}`); } } // Kullanım örneği const idorChecker = new IDORSecurityChecker(); idorChecker.implementAuthorizationCheck(); idorChecker.useIndirectReferences(); idorChecker.implementRBAC(); idorChecker.applyDataFiltering(); idorChecker.applyRateLimiting(); idorChecker.useParameterEncryption(); idorChecker.generateReport();
IDOR saldırıları, web uygulamaları için ciddi bir güvenlik tehdidi oluşturur. Ancak, doğru önlemler alındığında bu tür saldırıları etkili bir şekilde önlemek mümkündür. Yetkilendirme kontrolleri, dolaylı nesne referansları, rol tabanlı erişim kontrolü, veri filtreleme, rate limiting ve parametre şifreleme gibi teknikleri bir arada kullanarak, uygulamanızı IDOR saldırılarına karşı güçlü bir şekilde koruyabilirsiniz.
Unutmayın ki, güvenlik sürekli bir süreçtir. Uygulamanızı düzenli olarak güvenlik açıklarına karşı test edin, güncel güvenlik pratiklerini takip edin ve yeni ortaya çıkan tehditlere karşı hazırlıklı olun.
Siz IDOR saldırılarına karşı hangi önlemleri alıyorsunuz? Uygulamalarınızda karşılaştığınız zorluklar neler? Deneyimlerinizi ve düşüncelerinizi yorumlarda paylaşın!
Güvenli kodlamalar ve IDOR'suz bir dünya dilerim!