Celah keamanan IDOR (Insecure Direct Object References) terjadi ketika aplikasi memberikan akses langsung ke objek berdasarkan input pengguna tanpa melakukan verifikasi otorisasi yang memadai. Penyerang dapat memanipulasi parameter seperti ID pengguna, nomor pesanan, atau nama file pada URL atau badan permintaan (request body) untuk mengakses data milik pengguna lain secara ilegal. Menutup celah ini memerlukan penerapan kontrol akses yang ketat baik di sisi server PHP maupun Express.js (Node.js).
Untuk mengamankan aplikasi, setiap permintaan yang mengakses sumber daya spesifik wajib melalui lapisan verifikasi kepemilikan (ownership validation). Pengembang tidak boleh hanya mengandalkan autentikasi (siapa pengguna tersebut), tetapi harus wajib menerapkan otorisasi (apakah pengguna tersebut berhak mengakses data yang diminta).
Mitigasi IDOR pada Aplikasi Express.js
Pada lingkungan Express.js, mitigasi utama dilakukan dengan membuat fungsi middleware verifikasi kepemilikan sebelum rute (route handler) mengeksekusi query ke database. Berikut adalah contoh implementasi kode untuk menutup celah IDOR:
const express = require('express');
const router = express.Router();
// Middleware verifikasi kepemilikan dokumen
const verifyDocumentOwner = async (req, res, next) => {
try {
const documentId = req.params.id;
const userId = req.user.id; // Diambil dari token JWT yang telah diautentikasi
const document = await Database.findDocumentById(documentId);
if (!document) {
return res.status(404).json({ error: 'Dokumen tidak ditemukan' });
}
// Validasi apakah pemilik dokumen sama dengan user yang sedang login
if (document.owner_id !== userId) {
return res.status(403).json({ error: 'Akses ditolak: Anda tidak memiliki izin' });
}
req.document = document; // Teruskan data ke controller berikutnya
next();
} catch (error) {
res.status(500).json({ error: 'Kesalahan pada server' });
}
};
// Rute aman dengan middleware IDOR
router.get('/documents/:id', authenticateToken, verifyDocumentOwner, (req, res) => {
res.json({ success: true, data: req.document });
});
module.exports = router;Mitigasi IDOR pada Aplikasi PHP
Pada aplikasi PHP murni atau menggunakan kerangka kerja (framework) seperti Laravel, pencegahan IDOR dilakukan dengan memastikan parameter dari klien divalidasi terhadap sesi aktif pengguna sebelum query SQL dieksekusi. Berikut adalah contoh implementasi pada script PHP prosedural/objek:
<?php
session_start();
require_once 'db_connection.php';
// Pastikan pengguna sudah login
if (!isset($_SESSION['user_id'])) {
http_response_code(401);
echo json_encode(['error' => 'Unauthorized']);
exit;
}
$current_user_id = $_SESSION['user_id'];
$requested_invoice_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$requested_invoice_id) {
http_response_code(400);
echo json_encode(['error' => 'Invalid ID']);
exit;
}
// Query dengan menyertakan kondisi user_id untuk mencegah IDOR
$stmt = $pdo->prepare('SELECT * FROM invoices WHERE id = ? AND user_id = ?');
$stmt->execute([$requested_invoice_id, $current_user_id]);
$invoice = $stmt->fetch();
if (!$invoice) {
http_response_code(403);
echo json_encode(['error' => 'Akses ditolak atau data tidak ditemukan']);
exit;
}
echo json_encode(['success' => true, 'data' => $invoice]);
?>Matriks Perbandingan Strategi Pencegahan IDOR
| Strategi Pengamanan | Implementasi di Express.js | Implementasi di PHP | Tingkat Efektivitas |
|---|---|---|---|
| Object Ownership Validation | Memeriksa req.user.id === data.owner_id via middleware. | Menambahkan klausul AND user_id = ? pada perintah SQL. | Sangat Tinggi |
| Indirect Reference / Hashes | Menggunakan UUID v4 atau hash acak alih-alih ID auto-increment numerik. | Menggunakan Ramsey/Uuid atau uniqid() untuk primary key/token akses. | Tinggi |
| Role-Based Access Control (RBAC) | Pemeriksaan peran menggunakan pustaka seperti AccessControl atau custom guard. | Validasi level peran pengguna pada middleware/session handler. | Tinggi |
Langkah-Langkah Teknis Audit dan Perbaikan
Lakukan tahapan berikut secara berkala untuk memastikan aplikasi bebas dari kerentanan referensi objek langsung:
- Inventarisasi Endpoint: Petakan seluruh rute API atau URL yang menerima parameter ID berbasis angka atau string yang dapat ditebak.
- Uji Coba Horizontal Privilege Escalation: Masuk dengan Akun A, ambil ID milik Akun B, lalu coba akses melalui sesi Akun A untuk melihat apakah data bocor.
- Ganti ID Numerik Berurutan: Pertimbangkan migrasi dari penggunaan ID integer berurutan (1, 2, 3...) ke UUID (Universally Unique Identifier) untuk mempersulit penyerang menebak objek lain.
- Terapkan Logging Akses: Pantau percobaan akses yang menghasilkan status
403 Forbiddensecara berulang sebagai indikator potensi serangan brute-force IDOR.