Broken Access Control, kullanıcıların yetkisi olmadığı kaynaklara erişmesine veya işlem yapmasına izin veren kritik bir güvenlik açığıdır. OWASP Top 10 2021 listesinde birinci sırada yer alır ve test edilen uygulamaların %94'ünde bu açık tespit edilmiştir. 2013 Yılında Facebook 2023 yılında Github Otpus gibi devler bu açık yüzünden bir çok sorun yaşamıslardır.
Bu hata başlıca bir sisteme üye girişi yaptıkdan sonra kendini sisteme farklı birisi olarak tanıtarak bilgi çalmaya yarar. örneklerle açıklamak gerekirse Yatay yetki kullanarak farklı bir kullanıcı gibi davranabilirsiniz.
Örnek 1 : https://turkhacks.com/profile?id=5
burada turkhack sitesninin 5. kullanıcısı sizsiniz sadece urldeki id kısmını değiştirerek farklı kullanıcıların profillerini görüntüleyebilirsiniz. Böylelikle profil bilgilerinin korumalı oldugu sistemlerde farklı kullanıcıların bilgilerine erişim sağlayabilirsiniz.
Hatalı Kodlama örneği
Doğru Kodlama Örneği
Farklı bir kullanım ile dikey yetkisiz erişimle admin paneline erişebilir yada yetkiniz olmayan dosyalara erişim sağlayabilirsiniz.
Bu yapıda bulunan bir sitede yetki kontrolü yapılmadığı için sisteme giriş yapmıs bir kullanıcı kolaylıkla panele erişim sağlayabilir. bunun yerine aşağıdaki gibi bir kod yapısı daha güvenli olacaktır.
Yukarıda örneklerle anlatmaya çalıştığım açıklardan 3 farklı yöntem ile korunmaya çalışabilirsiniz.
1. sunucu taraflı kontrol ile istemci tarafından gelen inputlara geçersiz kılabilirsiniz RBAC Rol tabanlı kullanıcı kontrolü yaparak
yada Sayısal ID yerine UUID kullanımı ile güvenliğinizi sağlayabilirsini.
Bu hata başlıca bir sisteme üye girişi yaptıkdan sonra kendini sisteme farklı birisi olarak tanıtarak bilgi çalmaya yarar. örneklerle açıklamak gerekirse Yatay yetki kullanarak farklı bir kullanıcı gibi davranabilirsiniz.
Örnek 1 : https://turkhacks.com/profile?id=5
burada turkhack sitesninin 5. kullanıcısı sizsiniz sadece urldeki id kısmını değiştirerek farklı kullanıcıların profillerini görüntüleyebilirsiniz. Böylelikle profil bilgilerinin korumalı oldugu sistemlerde farklı kullanıcıların bilgilerine erişim sağlayabilirsiniz.
Hatalı Kodlama örneği
// KULLANICI PROFİLİ GÖSTERME (GÜVENSİZ)$user_id = $_GET['id']; // Doğrudan kullanıcı girdisi$query = "SELECT * FROM users WHERE id = $user_id";$result = mysqli_query($conn, $query);$user_data = mysqli_fetch_assoc($result);// Yetki kontrolü YOK!echo "Kullanıcı Adı: " . $user_data['username'];Doğru Kodlama Örneği
// KULLANICI PROFİLİ GÖSTERME (GÜVENLİ)session_start();$logged_in_user_id = $_SESSION['user_id']; // Oturumdaki kullanıcı ID$user_id = $_GET['id'];if ($user_id != $logged_in_user_id) { // Yetki kontrolü die("Yetkisiz erişim!"); // 403 döndür}$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $user_id);$stmt->execute();// Sadece oturum sahibinin verileri gösterilirFarklı bir kullanım ile dikey yetkisiz erişimle admin paneline erişebilir yada yetkiniz olmayan dosyalara erişim sağlayabilirsiniz.
@app.route('/admin-panel')def admin_panel(): if 'user' in session: return render_template('admin.html') # Yetki kontrolü YOK! else: return redirect('/login')Bu yapıda bulunan bir sitede yetki kontrolü yapılmadığı için sisteme giriş yapmıs bir kullanıcı kolaylıkla panele erişim sağlayabilir. bunun yerine aşağıdaki gibi bir kod yapısı daha güvenli olacaktır.
@app.route('/admin-panel')def admin_panel(): if 'user' in session and session['user']['role'] == 'admin': # Rol kontrolü return render_template('admin.html') else: abort(403) # ForbiddenYukarıda örneklerle anlatmaya çalıştığım açıklardan 3 farklı yöntem ile korunmaya çalışabilirsiniz.
1. sunucu taraflı kontrol ile istemci tarafından gelen inputlara geçersiz kılabilirsiniz RBAC Rol tabanlı kullanıcı kontrolü yaparak
// Spring Security Örneği@PreAuthorize("hasRole('ADMIN') or #userId == principal.id")public User getUserProfile(Long userId) { ... }yada Sayısal ID yerine UUID kullanımı ile güvenliğinizi sağlayabilirsini.
- Örnek UUID URL:
/profile?id=cdb4d3a0-10e7-4fe2-840b-7a8a8a8a8a8a





