Keamanan Siber 7 Juli 2026 FMKelana

Tips dan Trik Rate limiting dan brute force protection

#rate #limiting #brute #force #protection #tutorial #indonesia
```html

Rate Limiting dan Brute Force Protection: Panduan Lengkap untuk Developer

Serangan brute force masih menjadi ancaman serius bagi aplikasi web dan API. Tanpa perlindungan yang memadai, penyerang dapat mencoba ribuan kombinasi username dan password dalam hitungan detik. Solusi paling efektif adalah menerapkan rate limiting — teknik yang membatasi jumlah permintaan dalam periode waktu tertentu. Artikel ini akan membahas cara kerja mekanisme ini, bagaimana penyerang mengeksploitasinya, serta implementasi praktis yang bisa langsung Anda gunakan.

Pendahuluan: Mengapa Rate Limiting Penting?

Setiap endpoint login, pendaftaran, atau API publik adalah target empuk serangan brute force. Tanpa pembatasan, seorang penyerang bisa menggunakan script sederhana untuk mencoba jutaan kata sandi dari daftar common passwords. Dampaknya mulai dari pembobolan akun pengguna hingga kerusakan reputasi bisnis. Rate limiting bertindak sebagai "gerbang" yang memaksa penyerang memperlambat atau menghentikan usahanya.

Pembahasan: Konsep Dasar Rate Limiting

Ada beberapa algoritma umum yang digunakan:

  • Token Bucket: Setiap pengguna memiliki bucket yang berisi token. Setiap permintaan mengkonsumsi satu token. Jika token habis, permintaan ditolak hingga token diisi ulang secara periodik.
  • Leaky Bucket: Permintaan masuk ke dalam antrian dan diproses dengan kecepatan tetap. Kelebihan permintaan akan "bocor" (ditolak).
  • Sliding Window Log: Mencatat timestamp setiap permintaan. Jika jumlah permintaan dalam jendela waktu melebihi batas, permintaan ditolak.

Celah keamanan terjadi ketika tidak ada limitasi sama sekali — penyerang bisa mengirim permintaan tanpa hambatan. Bahkan dengan limitasi sederhana pun, penyerang dapat menggunakan IP berbeda (distributed brute force) untuk menghindari deteksi.

Contoh Implementasi

1. Implementasi dengan Express.js (Node.js)

Berikut contoh menggunakan library express-rate-limit untuk membatasi 5 percobaan login per menit per IP:

const rateLimit = require('express-rate-limit');

const loginLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 menit
  max: 5, // maksimal 5 permintaan
  message: { error: 'Terlalu banyak percobaan, coba lagi dalam 1 menit' },
  standardHeaders: true,
  legacyHeaders: false,
});

app.post('/login', loginLimiter, (req, res) => {
  // logika login
});

2. Implementasi Tanpa Library (In-Memory Counter)

Cocok untuk proyek kecil atau saat tidak ingin menambah dependensi. Contoh ini menggunakan Map untuk melacak IP dan jumlah percobaan:

const requestCounts = new Map();

function rateLimiter(req, res, next) {
  const ip = req.ip;
  const now = Date.now();
  const windowMs = 60 * 1000;
  const maxRequests = 5;

  if (!requestCounts.has(ip)) {
    requestCounts.set(ip, { count: 1, startTime: now });
    return next();
  }

  const data = requestCounts.get(ip);
  if (now - data.startTime > windowMs) {
    data.count = 1;
    data.startTime = now;
    return next();
  }

  data.count++;
  if (data.count > maxRequests) {
    return res.status(429).json({ error: 'Rate limit exceeded' });
  }
  next();
}

app.post('/login', rateLimiter, (req, res) => { ... });

Catatan: In-memory counter tidak persisten dan akan hilang saat server restart. Untuk produksi, gunakan Redis atau database.

Analisis Keamanan: Cara Kerja Celah dan Demonstrasi Eksploitasi

Bayangkan aplikasi tanpa rate limiting. Penyerang menggunakan script sederhana:

import requests

url = "http://target.com/login"
for password in open("wordlist.txt"):
    r = requests.post(url, data={"username":"admin", "password": password})
    if "Login berhasil" in r.text:
        print("Password ditemukan: ", password)
        break

Script ini bisa mencoba ribuan kata sandi per menit. Jika sistem hanya memverifikasi credential tanpa batasan, dalam hitungan menit akun admin bisa diretas. Lebih berbahaya lagi, penyerang bisa memanfaatkan botnet dengan ribuan IP berbeda untuk menghindari limitasi berbasis IP saja.

Dampak eksploitasi ini antara lain: pengambilalihan akun, pencurian data sensitif, dan beban berlebih pada server yang bisa menyebabkan denial of service (DoS).

Cara Pencegahan Detail

Berikut langkah-langkah mitigasi yang bisa langsung diterapkan:

  1. Terapkan Rate Limiting Berlapis: Batasi per IP (misal 5 percobaan/menit) dan per akun (misal 10 percobaan/menit per username). Ini mengantisipasi distributed brute force.
  2. Gunakan CAPTCHA: Setelah beberapa kali gagal, tampilkan CAPTCHA untuk membedakan manusia dan bot.
  3. Implementasi Exponential Backoff: Tingkatkan waktu tunggu secara eksponensial setelah setiap kegagalan. Contoh: 1 detik, 2 detik, 4 detik, dst.
  4. Monitor dan Blacklist: Pantau pola permintaan abnormal dan blokir sementara IP yang mencurigakan. Gunakan tools seperti Fail2ban untuk server Linux.
  5. Gunakan Header Keamanan: Set header Retry-After pada respons 429 agar klien tahu kapan bisa mencoba lagi.
  6. Validasi Input Tambahan: Gunakan waktu respons konstan (constant-time comparison) untuk password agar tidak membocorkan informasi via timing attack.
  7. Distributed Rate Limiting: Untuk aplikasi skala besar, gunakan Redis atau database terpusat agar limitasi konsisten di seluruh instance server.

Kesimpulan

Rate limiting adalah pertahanan pertama yang wajib dimiliki setiap aplikasi yang menghadapi publik. Tanpanya, serangan brute force dapat berhasil dengan mudah. Dengan menerapkan mekanisme seperti token bucket atau sliding window, ditambah CAPTCHA dan monitoring, Anda secara signifikan mengurangi risiko pembobolan akun. Ingatlah: tidak ada solusi yang sempurna, tetapi kombinasi beberapa lapisan keamanan akan membuat upaya penyerang jauh lebih mahal secara waktu dan sumber daya. Mulailah dengan rate limiting sederhana, lalu tingkatkan seiring kebutuhan aplikasi Anda.

```
Bagikan:

Artikel Terkait

Komentar (0)

Belum ada komentar. Jadilah yang pertama!

Tinggalkan Komentar