حملات IDOR
حملات IDOR
حملات IDOR یا همان Insecure Direct Object Reference در واقع یک خلا امنیتی است که موجب دسترسی غیرمجاز به داده ها میشود.
حمله IDOR (Insecure Direct Object References) چیست؟
حمله IDOR (مخفف Insecure Direct Object References) یکی از رایجترین آسیبپذیریهای امنیتی در برنامههای وب است که در لیست OWASP Top 10 قرار دارد. این حمله زمانی اتفاق میافتد که یک برنامه وب به کاربر اجازه میدهد بهطور مستقیم به منابع داخلی (مانند فایلها، رکوردهای دیتابیس یا مسیرهای سیستم) دسترسی پیدا کند، بدون اینکه بررسی کند آیا کاربر مجوز لازم را دارد یا خیر.
بسیاری از این آسیبپذیریها ریشه در نقصهای ساختاری دارند؛ به همین دلیل، پیادهسازی روشهای کنترل دسترسی در سازمانها میتواند یکی از موثرترین لایههای دفاعی در برابر این نوع حملات باشد.
مثال ساده از حمله IDOR
فرض کنید یک سایت دارای URL زیر برای مشاهده پروفایل کاربران است:
https://example.com/profile?id=123
اگر مهاجم مقدار id را به 124 تغییر دهد و بتواند به پروفایل کاربر دیگری دسترسی پیدا کند، این یک حمله IDOR است. استفاده از پروتکلهای استاندارد و امن نظیر OAuth 1 و OAuth 2، به توسعهدهندگان کمک میکند تا فرآیند اعطای دسترسی را با دقت و امنیت بسیار بالاتری مدیریت کنند.

چگونه از IDOR جلوگیری کنیم؟
1. اعتبارسنجی دسترسی (Authorization Checks)
همیشه قبل از نمایش یا تغییر دادهها، بررسی کنید که کاربر مجوز دسترسی به آن منبع را دارد. مطالعه دقیق چنین تهدیداتی، بخشی از رویکرد پیشگیرانه در حوزه گسترده امنیت سایبری محسوب میشود که هدف آن حفاظت از زیرساختها و دادههاست.
// مثال در PHP (با فریمورک Laravel)
public function showProfile($id) {
$user = User::find($id);
if (auth()->user()->id !== $user->id) {
abort(403, 'دسترسی غیرمجاز');
}
return view('profile', ['user' => $user]);
}
2. استفاده از شناسههای غیرقابل حدس
به جای استفاده از اعداد ترتیبی (1, 2, 3…)، از UUID یا توکنهای تصادفی استفاده کنید.
// مثال در Python (با Flask)
from uuid import uuid4
user_id = uuid4() # تولید یک شناسه تصادفی
print(user_id) # مثلاً: 'a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8'
3. رمزنگاری پارامترهای حساس
اگر لازم است شناسهها در URL نمایش داده شوند، میتوانید آنها را رمزنگاری کنید.
// مثال در Node.js (با Express و crypto)
const crypto = require('crypto');
function encryptId(id) {
const cipher = crypto.createCipher('aes-256-cbc', 'secret-key');
let encrypted = cipher.update(id.toString(), 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
function decryptId(encrypted) {
const decipher = crypto.createDecipher('aes-256-cbc', 'secret-key');
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
4. استفاده از توکنهای موقت (One-Time Tokens)
برای عملیات حساس (مثل تغییر رمز عبور)، از توکنهای یکبارمصرف استفاده کنید. در بسیاری از سیستمهای مدرن، مدیریت نادرست توکنهای احراز هویتJWT، میتواند مسیر را برای سوءاستفاده از شناسههای کاربری و وقوع حملات دسترسی باز کند.
// مثال در Django
from django.contrib.auth.tokens import PasswordResetTokenGenerator
token_generator = PasswordResetTokenGenerator()
token = token_generator.make_token(user)
جمعبندی
- IDOR یک حمله رایج است که به مهاجمان اجازه دسترسی غیرمجاز به دادهها را میدهد.
- برای جلوگیری از آن، همیشه اعتبارسنجی دسترسی (Authorization) را انجام دهید.
- از شناسههای غیرقابل حدس (مثل UUID) استفاده کنید.
- در صورت نیاز، پارامترهای URL را رمزنگاری کنید.