PmaControl logo PmaControl
  • مرحباً
  • PmaControl
    • وكلاء الذكاء الاصطناعي 13 وكلاء محليين
    • عروضنا المجتمع، السحابة، محليًا، المميز
    • التوثيق أدلة، API، الهندسة المعمارية
    • السوق المكونات الإضافية للمجتمع
    • عملاء أكثر من 28 شركة
    • الأسئلة الشائعة 25 سؤالا / 7 فئات
    قواعد البيانات
    • ماريا دي بي 31 مادة
    • ماي إس كيو إل 11 مادة
    • مجموعة جاليرا 6 عناصر
    • ماكس سكيل 3 عناصر
    • ProxySQL 2 عناصر
    • أمازون أورورا ماي إس كيو إل 0 العناصر
    • قاعدة بيانات أزور 0 العناصر
    • انقر البيت 0 العناصر
    • GCP CloudSQL 0 العناصر
    • بيركوناسيرفر 0 العناصر
    • متجر واحد 0 العناصر
    • تي دي بي 0 العناصر
    • سرعة 0 العناصر
    الحلول
    • دعم 24 × 7 حالات الطوارئ MariaDB وMySQL
    • Observabilité SQL المراقبة والتنبيهات والطوبولوجيا
    • Haute disponibilité النسخ المتماثل، تجاوز الفشل، جاليرا
    • Disaster Recovery النسخ الاحتياطي والاستعادة، RPO/RTO
    • Sécurité & conformité التدقيق، اللائحة العامة لحماية البيانات، SOC2
    • Migration & upgrade صفر توقف عن العمل، pt-osc، gh-ost
  • عروضنا
  • موارد
    • التوثيق الأدلة الفنية وواجهات برمجة التطبيقات
    • مركز تحسين MySQL مؤشر تخفيض السعر والمقاييس والإعدادات والحوادث
    • الأسئلة الشائعة 25 سؤالا متكررا
    • الشهادات ملاحظات العملاء وحالات الاستخدام
    • مدونة مقالات ورؤى
    • خريطة الطريق الميزات القادمة
    مجالات الخبرة
    • Observabilité SQL المراقبة والتنبيهات وطوبولوجيا Dot3
    • Haute disponibilité النسخ المتماثل، تجاوز الفشل، جاليرا
    • Sécurité & conformité التدقيق، اللائحة العامة لحماية البيانات، SOC2، ISO 27001
    • Disaster Recovery النسخ الاحتياطي والاستعادة، RPO/RTO
    • Performance & optimisation ملخصات، شرح، ضبط
    • Migration & upgrade صفر توقف عن العمل، pt-osc
    روابط سريعة
    • جيثب ويكي 26 صفحة - التثبيت والمحرك والمكونات الإضافية
    • كود المصدر مستودع جيثب الرسمي
    • دعم 24 × 7 حالات الطوارئ MariaDB وMySQL
    • احجز عرضًا توضيحيًا 30 دقيقة - هندسة معمارية حقيقية
  • دعم 24 × 7
  • احجز عرضًا توضيحيًا
احجز عرضًا توضيحيًا
🇫🇷 FR Français 🇬🇧 EN English 🇵🇱 PL Polski 🇷🇺 RU Русский 🇨🇳 ZH 中文 🇸🇦 AR العربية
التوثيق › Protection CSRF (Origin + jeton scopé)

Protection CSRF (Origin + jeton scopé)

لماذا حماية المشاركات

بدون رمز CSRF المرتبط بالجلسة، يمكن لموقع جهة خارجية إرسال نموذج POST إلى PmaControl بينما يتصفح المستخدم المعتمد في مكان آخر. يقوم المتصفح تلقائيًا بإرفاق ملفات تعريف الارتباط للجلسة ويتم تنفيذ الإجراء دون نية المستخدم - تعديل التكوين، وإطلاق العملية، والتحديث المضمن.

يؤدي التبديل من GET إلى POST إلى تصحيح المشغلات السلبية (التحميل المسبق، الارتباط الذي تم الزحف إليه)، ولكنه لا يكفي ضد هجوم CSRF النشط من مجال آخر.

Glial المساعد المشترك

من Glial v5.1.40، تتم مشاركة منطق CSRF والتحقق من صحة المنشأ/المرجع في إطار العمل، وبالتالي تتم مشاركته بواسطة جميع وحدات التحكم PmaControl:

  • Glial\Security\Csrf::issueToken() / Csrf::validateToken() — إصدار الرمز المميز والتحقق منه حسب النطاق الوظيفي.
  • Glial\Http\Request::isSameSite() — مقارنة الأصل (الأولوية) ثم المُحيل (الاحتياطي) مقابل الأصل الحالي.
لا توجد وحدة تحكم PmaControl تكرر هذا المنطق: Worker.php يحتوي فقط على تنسيق HTTP الخاص بـ POST /Worker/update.

مخطط التدفق

مخطط آلية CSRF - إصدار الرمز المميز من جانب الخادم، وإدخال HTML، وطلب AJAX، وسلسلة التحقق من 4 خطوات.
مخطط آلية CSRF - إصدار الرمز المميز من جانب الخادم، وإدخال HTML، وطلب AJAX، وسلسلة التحقق من 4 خطوات.

إصدار الرمز المميز

قبل تقديم طريقة عرض تحتوي على نموذج أو خلية قابلة للتحرير، تقوم وحدة التحكم بإصدار رمز مميز على نطاق الميزة:

<?php
use Glial\Security\Csrf;

$token = Csrf::issueToken($_SESSION, 'worker.update');
$this->set('csrf_token', $token);
يمنع النطاق إعادة تشغيل الرمز المميز الذي تم إصداره لـ worker.update على daemon.start. يتم تخزين الرمز المميز في $_SESSION['csrf_tokens'][$scope] ويستمر حتى نهاية جلسة المستخدم.

الحقن من جانب العميل

بالنسبة للخلايا القابلة للتحرير المضمّن (قابلة للتحرير)، يتم إدخال الرمز المميز عبر سمتين data-*:

<td class="editable"
    data-name="nb_worker"
    data-csrf-field="csrf_token"
    data-csrf-token="<?= htmlspecialchars($csrf_token, ENT_QUOTES, 'UTF-8') ?>">
    5
</td>
يتم تهريب القيم بشكل منهجي عبر htmlspecialchars(..., ENT_QUOTES, 'UTF-8') لتحييد أي حقن HTML/JS في الخلية.

يكتشف App/Webroot/js/Tree/index.js JS وجود data-csrf-token ويضيف الرمز المميز تلقائيًا إلى معلمات POST المرسلة بواسطة bootstrap-editable:

$.fn.editable.defaults.params = function (params) {
    var $cell = $(this).closest('[data-csrf-token]');
    if ($cell.length) {
        params[$cell.data('csrf-field')] = $cell.data('csrf-token');
    }
    return params;
};
بعد تحديث AJAX (على سبيل المثال عبر البرنامج الخفي)، يتم استدعاء window.pmacontrolInitLineEdit(context) مرة أخرى في السياق المعاد تحميله لربط الرمز المميز الجديد بالخلايا الجديدة.

سلسلة التحقق من جانب الخادم

أربع عمليات تحقق تتبع بعضها البعض بهذا الترتيب الدقيق، قبل أي بناء SQL:

  1. طريقة HTTP — POST فقط؛ أي طريقة أخرى ترجع 405 Method Not Allowed.
  2. أصل الموقع نفسه — Origin في الأولوية، ثم Referer في الإجراء الاحتياطي؛ تم رفض القيم null، المرتبطة بالبروتوكول أو ذات المخطط/المضيف/المنفذ المختلف مع 403 Invalid request origin.
  3. رمز CSRF — مقارنة hash_equals() بين حقل الحمولة csrf_token و$_SESSION['csrf_tokens'][$scope]؛ يقوم الرمز المفقود أو غير الصالح بإرجاع 403 Invalid CSRF token.
  4. حمولة القائمة المسموح بها - الحقول والأنواع المخصصة لنقطة النهاية هذه فقط؛ حمولة غير قائمة ترجع 400 Invalid worker update payload.
<?php
class Worker
{
    public function update()
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            http_response_code(405);
            return;
        }
        if (!Glial\Http\Request::isSameSite($_SERVER)) {
            http_response_code(403);
            echo 'Invalid request origin';
            return;
        }
        if (!Glial\Security\Csrf::validateToken($_POST, $_SESSION, 'worker.update')) {
            http_response_code(403);
            echo 'Invalid CSRF token';
            return;
        }

        $sql = $this->buildWorkerUpdateSql($_POST);
        if ($sql === null) {
            http_response_code(400);
            echo 'Invalid worker update payload';
            return;
        }

        // SQL exécuté ici uniquement
    }
}
طالما لم يتم اجتياز جميع عمليات التحقق الأربعة، فلن يتم إنشاء استعلام SQL: يظل الدفاع متعمقًا حتى إذا انكسر أحد الأقفال.

المرجع - رموز الإرجاع

شفرة سبب متى
405 Method Not Allowed طريقة HTTP بخلاف POST.
403 Invalid request origin أصل/مرجع خارج الموقع، Origin: null، مرتبط بالبروتوكول أو مخطط/مضيف/منفذ مختلف.
403 Invalid CSRF token الرمز المميز مفقود من الحمولة أو لا يتوافق مع $_SESSION['csrf_tokens'][$scope].
400 Invalid worker update payload حقل خارج القائمة المسموح بها، قيمة غير صحيحة، pk سالبة أو فارغة.
لا تمنح أبدًا نقطة نهاية متحولة خيار GET احتياطيًا لتصحيح الأخطاء: سيؤدي هذا إلى تعطيل حماية CSRF بصمت، والتي تنطبق فقط على POST.

الإعفاءات الموثقة

يغطي مساعد CSRF منشورات الويب فقط. الأسطح التالية معفاة صراحة:

  • CLI php glial … - لا يوجد ملف تعريف ارتباط للجلسة، ولا يوجد سطح CSRF.
  • REST API من جهاز إلى جهاز — مصادقة رمزية منفصلة لواجهة برمجة التطبيقات؛ تم تعطيل التحكم في الأصل/المرجع لهذه المسارات ويتم توثيق الاستثناء لكل نقطة نهاية.
  • نقاط النهاية للقراءة فقط - تم تحويلها إلى GET، وبالتالي فهي خارج نطاق CSRF.

اختبارات مخصصة

تتم تغطية حماية CSRF بواسطة اختبارات PHPUnit التي تجسد بوضوح سيناريو الهجوم التاريخي:

./vendor/bin/phpunit tests/Glial/Security/CsrfTest.php
./vendor/bin/phpunit tests/Glial/Http/RequestTest.php
./vendor/bin/phpunit tests/Controller/WorkerUpdateSecurityTest.php
مع Origin: https://attacker.test أو أي موقع خارجي آخر، يتم رفض الحمولة في 403 Invalid request origin قبل أي كتابة، حتى لو تم توفير رمز CSRF صالح — ترفض سلسلة التحقق الطلب الموجود على عنصر تحكم الأصل قبل الوصول إلى الرمز المميز.
في هذه الصفحة
  • لماذا حماية المشاركات
  • Glial المساعد المشترك
  • مخطط التدفق
  • إصدار الرمز المميز
  • الحقن من جانب العميل
  • سلسلة التحقق من جانب الخادم
  • المرجع - رموز الإرجاع
  • الإعفاءات الموثقة
  • اختبارات مخصصة
← الصفحة السابقة الصفحة التالية →
PmaControl
+33 6 63 28 27 47 contact@pmacontrol.com
إشعارات قانونية GitHub اتصال
لا تنتظر وقوع الحادث حتى تفهم هندستك المعمارية. © 2014-2026 PmaControl — 68Koncept