شرح صفوف ومحتوى الفقرة
تثبت المصادقة هوية المستخدم، بينما تثبت الصلاحية (Authorization) ملكيته للسجل الذي يحاول تعديله أو حذفه؛ وإهمال ذلك يسبب ثغرة الوصول المباشر غير الآمن للكائنات (IDOR)!
- أضف دائماً الشرط
AND user_id = :user_idفي كل استعلامSELECTوUPDATEوDELETEعلى جداول المستخدمين. - إذا غيّر مستخدم الرقم في الرابط من
?id=10إلى?id=11، سيرجع الاستعلام صفر صفوف ويُرفض الطلب بالرمز403. - لا تثق أبداً بمعرف سجل قادم من
$_GETأو$_POSTدون التحقق من ملكيته.
لأن المهمة رقم 10 تخص المستخدم 42، فإن الاستعلام بمعرف المهاجم 99 يرجع false ويحبط ثغرة IDOR.
PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE tasks (id INTEGER PRIMARY KEY, user_id INT, title TEXT)');
$pdo->exec("INSERT INTO tasks VALUES (10, 42, 'Owner Task')");
// Attacker (user_id = 99) tries to fetch Task #10
$stmt = $pdo->prepare('SELECT * FROM tasks WHERE id = :id AND user_id = :uid');
$stmt->execute(['id' => 10, 'uid' => 99]);
$task = $stmt->fetch(PDO::FETCH_ASSOC);
echo $task ? "Loaded\n" : "403 Forbidden: IDOR Blocked!\n";