Skip to main content

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) dan fix (produksi) — di mode vuln proteksi 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.