2. Mitigasi IDOR (Insecure Direct Object Reference)
Deskripsi singkat
IDOR terjadi ketika aplikasi menampilkan objek berdasarkan input pengguna (mis. id di URL) tanpa memverifikasi otorisasi. Contoh: pasien A dapat melihat rekam medis pasien B hanya dengan mengganti parameter id.
Strategi Perbaikan
- Terapkan ownership check sebelum menampilkan atau mengizinkan akses ke data.
- Gunakan Role-Based Access Control untuk kasus pengguna dengan peran khusus (mis. admin/dokter).
Contoh: lib/Auth.php
class Auth {
public static function checkAccess($recordOwnerId) {
$myId = $_SESSION['user_id'] ?? null;
$myRole = $_SESSION['user_role'] ?? 'patient';
// 1. Admin/Dokter memiliki akses mutlak (Role-Based Access Control)
if ($myRole === 'admin') return true;
// 2. Pasien HANYA boleh mengakses data miliknya sendiri (Ownership Check)
if ($myId == $recordOwnerId) return true;
// 3. Blokir akses lainnya
return false;
}
}
Implementasi pada view_report.php
// Ambil data record berdasarkan ID URL
$stmt = $pdo->prepare("SELECT ... FROM medical_records ... WHERE m.id = ?");
$stmt->execute([$report_id]);
$record = $stmt->fetch(PDO::FETCH_ASSOC);
// [MITIGASI] Validasi Akses
if ($config['mode'] === 'fix') {
// Cek apakah user login == pemilik record ($record['user_id'])
if (!Auth::checkAccess($record['user_id'])) {
// Log percobaan akses ilegal
$logger->logEvent('IDOR_ATTEMPT', "Akses Ilegal...", $_SESSION['username']);
// Tampilkan error 403 Forbidden dan Hentikan Eksekusi
die("403 FORBIDDEN: Anda tidak memiliki izin mengakses rekam medis pasien lain!");
}
}
Catatan Mode
vuln: Aplikasi menampilkan data tanpa pengecekan kepemilikan.fix: Aplikasi melakukan pengecekan terhadap$_SESSION['user_id'].