حملات 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 است.
چگونه از 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)
برای عملیات حساس (مثل تغییر رمز عبور)، از توکنهای یکبارمصرف استفاده کنید.
// مثال در Django
from django.contrib.auth.tokens import PasswordResetTokenGenerator
token_generator = PasswordResetTokenGenerator()
token = token_generator.make_token(user)
جمعبندی
- IDOR یک حمله رایج است که به مهاجمان اجازه دسترسی غیرمجاز به دادهها را میدهد.
- برای جلوگیری از آن، همیشه اعتبارسنجی دسترسی (Authorization) را انجام دهید.
- از شناسههای غیرقابل حدس (مثل UUID) استفاده کنید.
- در صورت نیاز، پارامترهای URL را رمزنگاری کنید.