انتقل إلى محتوى الدرس

Enforcing Row Ownership Authorization التحقق من صلاحية ملكية السجل قبل التعديل والحذف

اجمع التوجيه وحراسة المصادقة واستعلامات PDO المحضرة وتقسيم الصفحات وحماية CSRF وXSS في مشروع لوحة تحكم CRUD متكاملة بـ PHP 8.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

تثبت المصادقة هوية المستخدم، بينما تثبت الصلاحية (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";