1. Mitigasi Brute Force (Brute Force Protection)
Deskripsi singkat
Serangan Brute Force terjadi ketika penyerang mencoba menebak kombinasi username dan password secara berulang-ulang. Pada Portal MediSecure, kami menggunakan rate limiting berbasis IP serta mekanisme lockout sementara.
Strategi Perbaikan
- Terapkan rate limiter yang menghitung jumlah kegagalan login per IP dalam interval waktu tertentu.
- Terapkan lockout sementara ketika kegagalan melebihi batas.
- Mode aplikasi memiliki
vuln(untuk demo) danfix(produksi) — di modevulnproteksi dimatikan.
Contoh: lib/RateLimiter.php
public function checkStatus() {
// Mode 'vuln' mematikan proteksi untuk demo
if ($this->config['mode'] === 'vuln') return ['blocked' => false];
$ip = $_SERVER['REMOTE_ADDR'];
$minutes = $this->config['lockout_time_minutes'];
$limit = $this->config['max_login_attempts'];
// Hitung jumlah kegagalan login dari IP ini dalam X menit terakhir
$stmt = $this->pdo->prepare("SELECT COUNT(*) FROM security_logs WHERE event_type = 'LOGIN_FAILED' AND ip_address = ? AND created_at > (NOW() - INTERVAL $minutes MINUTE)");
$stmt->execute([$ip]);
// Jika melebihi limit, blokir akses
if ($stmt->fetchColumn() >= $limit) {
$this->logAlertOnce($ip, $minutes); // Catat security alert
return ['blocked' => true, 'wait' => $minutes];
}
return ['blocked' => false];
}
Implementasi pada index.php (login)
// Inisialisasi Limiter
$limiter = new RateLimiter($pdo, $config, $logger);
// [MITIGASI] Cek Status Blokir
$limitStatus = $limiter->checkStatus();
// Nonaktifkan tombol login jika terblokir
$alert_msg = $limitStatus['blocked'] ? "⛔ SECURITY ALERT: IP Anda diblokir..." : "";
// Hanya proses login jika status blocked = false
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$limitStatus['blocked']) {
// ... Logika verifikasi password ...
}
Catatan Keamanan
Implementasi ini akan menghentikan tooling otomatis (mis. Hydra, Burp Suite) yang melakukan banyak percobaan otomatis dari IP yang sama.