Broken Access Control (Kırık Erişim Kontrolü)

Genel Bakış

Bu güvenlik açığı, kullanıcıların yetkileri olmayan kaynaklara erişebilmesinden kaynaklanır. Yani, bir kullanıcının sadece kendi verilerine erişebilmesi gerekirken, başka kullanıcıların verilerine de erişebilmesi durumunda ortaya çıkar.

Yaygın Örnekler

1. IDOR (Insecure Direct Object Reference - Güvensiz Doğrudan Nesne Referansı)

Örnek: Kullanıcının başka bir kullanıcının profilini görüntüleyebilmesi.

// Kötü örnek 
app.get('/profile/:id', (req, res) => {
    const user = getUserById(req.params.id);
    res.send(user);
});

// İyi örnek 
app.get('/profile/:id', (req, res) => {
    if (req.user.id !== req.params.id) {
        return res.status(403).send('Yetkisiz erişim');
    }
    const user = getUserById(req.params.id);
    res.send(user);
});

2. Missing Access Control (Eksik Erişim Kontrolü)

Örnek: Kullanıcının yetkisi olmayan işlemleri gerçekleştirebilmesi.

// Kötü örnek
app.post('/users/:id/delete', (req, res) => {
    deleteUser(req.params.id);
    res.send('Kullanıcı silindi');
});

// İyi örnek
app.post('/users/:id/delete', (req, res) => {
    if (!req.user.isAdmin) {
        return res.status(403).send('Yetkisiz erişim');
    }
    deleteUser(req.params.id);
    res.send('Kullanıcı silindi');
});

Korunma Yöntemleri

  • Yetkilendirme kontrollerini uygulayın
  • Kullanıcı rollerini doğru yönetin
  • Erişim kontrollerini merkezi hale getirin
  • API endpoint'lerini güvenli hale getirin
  • Düzenli güvenlik testleri yapın

Örnek Kod

Güvenli Erişim Kontrolü

class AccessControl {
    static async checkPermission(user, resource, action) {
        const permissions = await this.getUserPermissions(user.id);
        return permissions.some(p => 
            p.resource === resource && 
            p.action === action
        );
    }

    static async validateAccess(req, res, next) {
        const { resource, action } = req.route;
        const hasPermission = await this.checkPermission(
            req.user,
            resource,
            action
        );
        
        if (!hasPermission) {
            return res.status(403).send('Yetkisiz erişim');
        }
        next();
    }
}