Idor : زمانی رخ میده که برنامه به جای بررسی مجوز دسترسی , صرفا با تکیه به شناسه ورودی کاربر به اشیا داخلی دسترسی میدهد , یعنی بدون اینکه چک کنه این منابع برای این کاربر هست یا نه , این منابع رو نمایش بده
1. نمونه کد PHP
فرض کنید یه عملکردی داریم که همچین کویری میزنه سمت سرور :
$invoice_id = $_GET['info_id'];
$query = "SELECT * FROM informations WHERE id = $info_id";
اینجا مهاجم با عوض کردن id میتونه به منابع شحص دیگ دسترسی داشته باشه , حالا چطوری باید جلوی اینو گرفت :
باید چک کنیم ببینیم این منابع برای این فرد هست یا نه
$session_user_id = $_SESSION['user_id'];
$stmt = mysqli_prepare($conn,
"SELECT * FROM informations WHERE id = ? AND user_id = ?");
mysqli_stmt_bind_param($stmt, "ii", $info_id, $session_user_id);
این چک چطوری انجام میشه ؟ طبق کد بالا , بک اند باید بیاد و id درخواستی رو با id که توی سشن فرد هست مقایسه کنه
2. نمونه در SPA (React/Vue) و Backend (Nextjs)
درخواست آسیبپذیر فرانتاند:
fetch(/api/users/${userId})اینجا اگه سمت سرور چک نشه مهاجم میتونه با تغییر id خرابکاری کنه
بکاند آسیبپذیر (Express):
app.get('/api/users/:id', (req, res) => {
const user = database.find(u => u.id === req.params.id);
});راهحل: مقایسه کنیم ایا این id برای این سشن هست یا نه ( سمت بک اند )
if (req.params.id !== req.user.id) return 403;