⏱️ جاري الحساب…

الحماية من هجمات CSRF في ووردبريس: معمارية Nonces والاقتران الإجباري بفحص الصلاحيات

رسم مفاهيمي يوضح الحماية من CSRF في ووردبريس ضمن سلسلة تطوير ووردبريس
📋 فهرس محتويات المقال (اضغط للتنقل السريع) ▾

أهلاً بيك يا صديقي المطور في الدرس الحادي عشر من سلسلة معمارية إضافات ووردبريس المتقدمة. النهاردة ميعادنا مع حارس البوابة ضد واحدة من أخبث الهجمات في تاريخ الويب: **هجمات تزوير الطلبات عبر المواقع (Cross-Site Request Forgery – CSRF)**، وكيفية إبطالها تماماً باستخدام **رموز الأمان (WordPress Nonces)** والاقتران الإجباري بفحص الصلاحيات (**Capability Checks**).

تخيل السيناريو الواقعي ده:
أنت كمدير لموقع تجارة إلكترونية كبير مسجل دخولك في لوحة تحكم ووردبريس، والـ Session Cookie بتاعتك نشطة وشغالة في المتصفح. وفي نفس الوقت فتحت تبويب تاني (Tab 2) في المتصفح عشان تقرأ مقال في موقع إخباري أو تفتح رابط جالك في رسالة واتساب.
الموقع التاني ده لو صاحبه هاكر، يقدر يحط في صفحته كود جافاسكريبت خفي أو وسم صورة يبعت طلب في الخلفية للوحة تحكم موقعك أنت:

POST https://your-store.com/wp-admin/admin-post.php?action=transfer_funds&amount=50000
المتصفح هيبعت الريكوست ده أوتوماتيكياً محمل بكوكيز الجلسة بتاعتك أنت!
لو كود إضافتك بيعتمد على الكوكيز بس بدون حماية الـ Nonce، السيرفر هيفتكر إنك أنت اللي طلبت العملية، وهيحول الفلوس فوراً بدون ما تحس بأي حاجة!

في المقال ده، هنشرح بالعامية المصرية التقنية إزاي هجمات الـ CSRF بتشتغل، وإزاي ووردبريس بيحل المعضلة دي عن طريق “الرمز السري أحادي الاستخدام” (Nonce)، وهنتعلم الترسانة الكاملة لتوليد وفحص النونس في النماذج (Forms)، والروابط (URLs)، وطلبات الـ AJAX والـ REST API، مع كشف الحقيقة الخطيرة: ليه النونس ملوش أي قيمة لوحده بدون فحص current_user_can()، مع كود إنتاجي متكامل، ودراسة حالة حقيقية لمنصة دورات بالجيزة و20 سؤال وجواب لتغطية كل السيناريوهات.

تشريح هجوم الـ CSRF: كيف يستغل المهاجم ثقة المتصفح في جلسة المستخدم؟

عشان تفهم هجوم **Cross-Site Request Forgery**، لازم تفهم المبدأ الأساسي لطريقة عمل متصفحات الويب:
عندما يقوم المتصفح بإرسال أي طلب لموقع معين (مثلاً my-store.com)، المتصفح بيقوم تلقائياً وبشكل أعمى بإرفاق كافة الكوكيز (Cookies) المخزنة لهذا النطاق مع الطلب، حتى لو كان الطلب ده بدأ من موقع خارجي تماماً (مثل evil-site.com)!

المهاجم بيستغل الثقة العمياء دي بين السيرفر وبين كوكيز المستخدم؛ المهاجم مش محتاج يسرق كلمة سرك، هو بس بيخلي متصفحك يبعت ريكوست نيابة عنك وأنت مش واخد بالك!

وجه المقارنةبدون حماية Nonceمع حماية Nonce فقط (بدون فحص صلاحيات)المعمارية المتكاملة (Nonce + Capabilities)
مقاومة هجمات CSRFمعدومة تماماً؛ أي موقع خارجي يمكنه تنفيذ أوامر إدارية.محصنة بنسبة 100% ضد المواقع الخارجية (CSRF Safe).محصنة بنسبة 100% ضد المواقع الخارجية وضد التزوير الداخلي.
مقاومة تجاوز الصلاحيات (Privilege Escalation)معدومة؛ يستطيع أي شخص إرسال الطلب.معدومة؛ لو استطاع مستخدم برتبة Subscriber توليد النونس، سينفذ الأمر الإداري!منيعة تماماً؛ حتى لو ملك المستخدم النونس، ترفضه طبقة الصلاحيات فوراً.
آلية التحققفحص كوكيز تسجيل الدخول فقط.فحص تطابق الرمز السري الزمني (Nonce).فحص تطابق النونس + فحص رتبة وصلاحية المستخدم (current_user_can).
المعيار الأمنيثغرة أمنية حرجة جداً (Critical).حماية ناقصة وهشة (Incomplete).المعيار الذهبي المعتمد في كبرى إضافات ووردبريس العالمية.

ما هو الـ Nonce في ووردبريس؟ الحقيقة الهندسية

كلمة Nonce في أمن المعلومات هي اختصار لـ: “Number used ONCE” (رقم يُستخدم مرة واحدة فقط).
لكن في ووردبريس، الـ Nonce له خصوصية معمارية لازم تفهمها:
**الـ Nonce في ووردبريس ليس أحادي الاستخدام بالمعنى الحرفي، بل هو رمز تشفيري صالح لفترة زمنية محددة (Time-based Token)** تتراوح افتراضياً بين 12 إلى 24 ساعة!

الـ Nonce في ووردبريس بيتولد كـ Hash مشفر ناتج عن دمج 4 عناصر سرية:

  1. اسم الإجراء المحدد (Action Name): مثل delete_order_action أو update_settings.
  2. معرف المستخدم الحالي (User ID): الـ Nonce مربوط بالمستخدم الحالي تحديداً؛ لو الهاكر حاول يستخدم النونس بتاع مستخدم تاني هيفشل!
  3. مفتاح الجلسة النشط (Session Token): رمز الجلسة في الكوكيز.
  4. الأملاح والمفاتيح السرية (WordPress Secret Keys & Salts): الثوابت المعرفة في wp-config.php.
  5. النافذة الزمنية (Time Window): مقسمة على مدار 24 ساعة (دورتين كل دورة 12 ساعة).

بما إن الموقع الخارجي المهاجم لا يستطيع قراءة محتوى صفحة موقعك بسبب سياسة الأمان في المتصفحات المعروفة بـ Same-Origin Policy (SOP)، فهو يستحيل عليه معرفة قيمة الـ Nonce الصحيحة، وبالتالي أي طلب يبعته من برة هيترفض فوراً من ووردبريس!

ترسانة ووردبريس للتعامل مع الـ Nonces

ووردبريس بيوفر مجموعة دوال متكاملة تغطي كافة أشكال التفاعل في الموقع:

1. داخل نماذج الـ HTML (HTML Forms)

بنستخدم دالة wp_nonce_field() داخل وسم <form>. الدالة دي بتولد حقلين مخفيين (Hidden Inputs): حقل فيه الـ Nonce وحقل فيه رابط الـ Referer:


<form method="post" action="">
    
    
    

2. داخل الروابط (Action URLs)

لو عندك رابط في لوحة التحكم وظيفته تفعيل ميزة أو حذف عنصر بنقرة واحدة، بنغلف الرابط بدالة wp_nonce_url():


<a href="" class="button button-danger">مسح الكاش

3. داخل طلبات AJAX وواجهات الـ REST API

في الـ AJAX، بننشئ النونس باستخدام wp_create_nonce() ونمرره لكود الجافاسكريبت عبر wp_localize_script() أو كترويسة HTTP في الـ REST API:

 admin_url('admin-ajax.php'),
    'nonce'   => wp_create_nonce('enterprise_ajax_action')
]);

التحقق من صحة الـ Nonce في السيرفر: اختيار الدالة المناسبة

ووردبريس بيوفر 3 دوال رئيسية لفحص النونس في السيرفر:

1. دالة check_admin_referer() – لنماذج ولوحة الإدارة

الدالة الأسهل والأكثر استخداماً في لوحة التحكم. بتفحص النونس وتفحص الـ HTTP Referer تلقائياً؛ ولو النونس غير صالح أو منتهي الصلاحية، بتوقف التنفيذ فوراً وتستدعي wp_die() وتعرض رسالة: “Are you sure you want to do this?”.

<?php
// فحص وتأمين تلقائي يوقف التنفيذ لو في تلاعب
check_admin_referer('store_settings_verify_action', 'store_nonce_field');

2. دالة check_ajax_referer() – لطلبات الـ AJAX

مخصصة لطلبات الـ AJAX؛ بتفحص النونس في $_POST أو $_GET أو في ترويسات الـ Request. لو المعامل التالت die مضبوط على true (الافتراضي)، بتوقف التنفيذ وترجع استجابة JSON أو نص خطأ -1.

<?php
check_ajax_referer('enterprise_ajax_action', 'security');

3. دالة wp_verify_nonce() – للتحكم المخصص الكامل

الدالة الأكثر مرونة؛ مش بتوقف التنفيذ تلقائياً، بل بتعيد قيمة منطقية:

  • تعيد 1 لو النونس اتولد في آخر 12 ساعة (حديث جداً).
  • تعيد 2 لو النونس اتولد بين 12 إلى 24 ساعة مضت (صالح ولكنه قديم نسبياً).
  • تعيد false لو النونس غير صالح أو مزور أو منتهي الصلاحية.
 'انتهت صلاحية جلسة العمل، يرجى التحديث.'], 403);
}

المعمارية المتكاملة: توأمة النونس وفحص الصلاحيات (Twin-Lock Architecture)

تعال نرسخ القاعدة الذهبية اللي بنكررها دايماً في استشارات الأمان:

“الـ Nonce يتحقق من نية الطلب (Intent)، بينما الصلاحيات تتحقق من سلطة صاحب الطلب (Authority).”

تخيل بنك فيه خزنة فلوس:
– الـ Nonce هو عبارة عن “استمارة سحب رسمية مطبوعة ومختومة من البنك” (بتثبت إن الطلب مش مزور).
– الصلاحيات (Capabilities) هي “التأكد من أن الشخص اللي واقف قدام الصراف هو صاحب الحساب نفسه أو المدير العام المخول بالصرف” وليس مجرد زائر لقى الاستمارة على الأرض!

لو طبقت النونس بدون فحص current_user_can()، فأنت فتحت الباب لأي مستخدم مسجل (Subscriber) إنه يسرق الاستمارة وينفذ عمليات المديرين!
ولو طبقت الصلاحيات بدون نونس، فأنت سمحت للهاكر إنه يستغل جلسة المدير وينفذ عمليات عبر CSRF!
الحماية لا تكتمل إلا بوجود الاثنين معاً في كل دالة حساسة!

الكود البرمجي الكامل: معالج إعدادات متجر محصن بـ Twin-Lock

تعال نشوف كود إنتاجي متكامل يوضح إزاي تبني نموذج إدارة متجر إلكتروني محصن بنمط التوأمة الأمنية في النماذج والـ AJAX وروابط التفعيل السريع:

 403]);
        }

        // تنقية وتطهير البيانات
        $storeName = sanitize_text_field($_POST['store_name'] ?? '');
        $supportEmail = sanitize_email($_POST['support_email'] ?? '');

        // الحفظ في خيارات ووردبريس
        update_option('enterprise_store_name', $storeName);
        update_option('enterprise_support_email', $supportEmail);

        // إعادة التوجيه الآمنة
        wp_safe_redirect(add_query_arg('settings-updated', 'true', wp_get_referer()));
        exit;
    }

    /**
     * معالجة رابط إعادة تعيين توكن الـ API عبر GET URL
     */
    public function handleTokenReset(): void {
        // فحص النونس القادم في رابط الـ URL
        $nonce = $_GET['_wpnonce'] ?? '';
        if (!wp_verify_nonce((string)$nonce, 'reset_token_action')) {
            wp_die('رابط غير صالح أو انتهت صلاحيته الأمنية.', 'فشل التحقق', ['response' => 403]);
        }

        // فحص الصلاحيات الإدارية
        if (!current_user_can('manage_options')) {
            wp_die('غير مصرح لك بتصفير مفاتيح الربط البرمجي.', 'ممنوع', ['response' => 403]);
        }

        // توليد توكن تشفيري جديد وتخزينه
        $newToken = wp_generate_password(64, true, true);
        update_option('enterprise_live_api_token', $newToken);

        wp_safe_redirect(add_query_arg('token-reset', 'success', wp_get_referer()));
        exit;
    }

    /**
     * معالجة تبديل وضع الصيانة عبر AJAX
     */
    public function handleAjaxMaintenanceToggle(): void {
        // فحص نونس الـ AJAX
        check_ajax_referer('enterprise_ajax_nonce_action', 'security');

        // فحص الصلاحيات
        if (!current_user_can('manage_options')) {
            wp_send_json_error(['message' => 'صلاحيات غير كافية لتنفيذ هذا الإجراء.'], 403);
        }

        $currentState = (bool) get_option('enterprise_maintenance_mode', false);
        $newState = !$currentState;
        update_option('enterprise_maintenance_mode', $newState);

        wp_send_json_success([
            'is_maintenance' => $newState,
            'message'        => $newState ? 'تم تفعيل وضع الصيانة بنجاح.' : 'تم إيقاف وضع الصيانة وعودة المتجر للعمل.'
        ]);
    }

    /**
     * عرض شاشة الإعدادات
     */
    public function renderSettingsView(): void {
        $storeName = get_option('enterprise_store_name', 'متجري الإلكتروني');
        $supportEmail = get_option('enterprise_support_email', 'support@example.com');
        $resetUrl = wp_nonce_url(
            admin_url('admin-post.php?action=reset_enterprise_api_token'),
            'reset_token_action'
        );
        ?>
        

إعدادات المتجر المتقدمة

<form method="post" action="">
<input type="text" name="store_name" value="" class="regular-text">
<input type="email" name="support_email" value="" class="regular-text">

إدارة مفاتيح الربط البرمجي (API Credentials)

<a href="" class="button button-secondary" onclick="return confirm('هل أنت متأكد من رغبتك في تصفير مفتاح الربط؟ سيؤدي ذلك لإيقاف التطبيقات المرتبطة مؤقتاً.');"> إعادة توليد توكن الـ API الآن

<?php } }

دراسة حالة حقيقية: كارثة منصة الدورات التعليمية بالجيزة

عشان تعيش خطورة إهمال الـ Nonce وفحص الصلاحيات، هشاركك قصة واقعية حصلت مع منصة كورسات وتدريب عن بعد مقرها في محافظة الجيزة بتقدم دورات للثانوية العامة والجامعات لأكتر من 40,000 طالب:

الوضع القديم:
مبرمج المنصة كان عامل شاشة خاصة في لوحة التحكم بتسمح للمدير بتغيير البريد الإلكتروني للمدير العام (Admin Email) بنقرة زر واحدة.
المبرمج كان كاتب فحص الصلاحيات:

if (current_user_can('manage_options')) { update_option('admin_email', $_GET['new_email']); }
لكنه **نسي تماماً يضع فحص Nonce**! وقال: “ما هو مفيش حد يقدر يفتح الرابط ده غير المدير المسجل!”.

يوم الهجوم عبر الواتساب:
أحد قراصنة الإنترنت استغل الثغرة بذكاء شيطاني؛ تواصل مع مدير المنصة على الواتساب وادعى إنه ولي أمر طالب وعايز يستفسر عن خصم، وبعت للمدير رابط وقال له: “ممكن تشوف الصورة دي عشان فيها إيصال السداد البنكي؟”.
الرابط كان بيفتح صفحة ويب عادية جداً فيها صورة إيصال، لكن في كود الـ HTML المخفي للصفحة، كان في وسم صورة خبيث:

<img src="https://my-courses-platform.com/wp-admin/admin-post.php?action=change_admin_email&new_email=hacker@attacker.com" style="display:none;" />

الكارثة:
بمجرد ما مدير المنصة فتح صفحة الصورة وهو مسجل دخوله في لوحة تحكم المنصة، المتصفح نفذ طلب الـ <img> في الخلفية وأرسل كوكيز جلسة المدير تلقائياً!
في ثانية واحدة، تم تغيير البريد الإلكتروني للمدير العام لبريد الهاكر!
الهاكر على الفور طلب استعادة كلمة المرور عبر رابط “فقدت كلمة السر”، الرابط وصل على إيميل الهاكر، فقام بتغيير الباسورد وطرد المدير الحقيقي من الموقع، واستولى على حسابات الدفع وفيديوهات الدورات بالكامل وبدأ يبتز أصحاب المنصة مالياً!

خطة التدخل والإنقاذ المعماري:
تم استدعائي في الحال لإدارة الأزمة:

  1. استعادة الحساب عبر سطر الأوامر (WP-CLI): قمنا بالدخول للسيرفر عبر SSH واستعادة البريد الأصلي وإعادة تعيين كلمة مرور المدير بـ wp user update.
  2. تطبيق حماية الـ Nonce الصارمة (check_admin_referer): تم حظر أي استدعاء يغير بيانات حساسة عبر طلبات GET، وتحويل كافة الإجراءات لنماذج POST محمية بـ Nonces فريدة.
  3. حظر تغيير البريد الحساس بدون تأكيد بريدي مزدوج: تفعيل فحص رسائل التأكيد الثنائية قبل اعتماد البريد الجديد.

النتيجة: تم إغلاق الثغرة للأبد، وتم تدريب فريق المنصة على عدم فتح أي روابط خارجية أثناء تسجيل الدخول بحسابات المديرين.

الوصايا العشر لمنع هجمات CSRF في ووردبريس

  1. لا تنفذ إجراءات حساسة عبر طلبات GET: استخدم دائماً طلبات POST لعمليات الحذف أو التعديل أو تغيير الإعدادات؛ فالـ GET مخصص للقراءة فقط.
  2. استخدم wp_nonce_field في كل نموذج: لا تترك أي فورم في لوحة التحكم بدون حقول النونس التلقائية.
  3. حصن روابط الـ Actions بـ wp_nonce_url: إذا اضطررت لوضع رابط تفعيل أو حذف في جدول البيانات، غلف الرابط دائماً بـ Nonce.
  4. تحقق بـ check_admin_referer فوراً: اجعل فحص النونس أول سطر تنفيذي في دوال معالجة الطلبات في لوحة التحكم.
  5. لا تخلط النونس بالصلاحيات (Twin-Lock Rule): تذكر دائماً: النونس يمنع CSRF، والصلاحيات current_user_can() تمنع تجاوز الصلاحيات، ويجب أن يجتمعا معاً دائماً.
  6. احذر من أسماء الإجراءات العامة (Generic Action Names): اجعل اسم الـ Nonce Action فريداً ومحدداً بدقة (مثل delete_invoice_105) بدلاً من اسم عام مثل delete.
  7. اعتمد check_ajax_referer لطلبات الـ AJAX: لا تفحص النونس يدوياً في الـ AJAX، بل استخدم الدالة القياسية للتعامل السلس مع الأخطاء.
  8. احذر من الـ Nonce في الصفحات المخبأة (Page Caching): النونس له عمر زمني (12-24 ساعة)، وتخزين صفحات تحتوي على Nonce في كاش خارجي سيؤدي لانتهاء صلاحيته وفشل النماذج عند المستخدمين.
  9. استخدم SameSite Cookies: تأكد أن إعدادات خادمك تدعم ترويسة SameSite=Lax أو Strict للكوكيز لتقليل خطر الـ CSRF على مستوى المتصفح.
  10. أغلق الجلسات الحساسة عند الانتهاء: درب عملاءك على تسجيل الخروج من حسابات المديرين بعد الانتهاء من العمل لتفادي استغلال الجلسات المفتوحة.

معضلة النونس مع كاش الصفحات (Page Caching & Nonces) وكيفية حلها

واحدة من أعقد المشاكل المعمارية التي تواجه مطوري ووردبريس في المواقع الكبيرة عالية الزيارات هي: **التعارض الحتمي بين كاش الصفحات الثابتة (Full Page Caching) وبين الصلاحية الزمنية للـ Nonce!**

تخيل إنك مركب إضافة كاش قوية زي WP Rocket أو مخدم Varnish أو Cloudflare Cache، والصفحة فيها فورم تواصل أو نموذج إضافة مراجعة محمي بـ Nonce.
الكاش هيخزن كود الـ HTML كامل برمز النونس اللي اتولد وقت إنشاء الكاش. بعد 24 ساعة، النونس ده هيموت وتنتهي صلاحيته في ووردبريس، لكن الكاش لسه عارض الصفحة بنفس النونس الميت لكل الزوار!
أي زائر هيحاول يبعت الفورم، هيقابله خطأ:

“Are you sure you want to do this? / The link has expired.”!

الحلول المعمارية المعتمدة لحل أزمة كاش النونس:

  1. نمط التحديث الآلي للنونس عبر AJAX (Dynamic Nonce Refresh):
    الصفحة بتتحمل من الكاش وفيها حقل نونس فارغ، وبمجرد ما الصفحة تفتح في المتصفح، كود جافاسكريبت صغير بيبعت ريكوست خفيف للـ REST API أو الـ AJAX endpoint يجلب نونس حديث وخاص بالزائر الحالي ويحقنه في الفورم في أقل من 50 مللي ثانية.
  2. استثناء الصفحات التفاعلية من الكاش (Cache Exclusion):
    صفحات لوحة التحكم (wp-admin)، وصفحات الحساب (My Account)، وشاشات الدفع (Checkout) يجب استثناؤها تماماً من أي تخزين كاش ثابت لضمان توليد نونس طازج في كل ريكوست.
  3. استخدام Honeypots مع نماذج الزوار المجهولين:
    في النماذج العامة للزوار غير المسجلين (مثل نماذج الاتصال والاشتراك في النشرة البريدية)، يفضل الاعتماد على تقنيات مثل **Honeypot Fields** و **Cloudflare Turnstile / reCAPTCHA v3** بدلاً من النونس، لتجنب مشاكل انتهاء الجلسات في الصفحات المخبأة.

تعديل عمر النونس عبر فلتر nonce_life

في بعض التطبيقات المالية الحساسة أو إضافات معالجة الدفع، قد تعتبر فترة الـ 24 ساعة فترة طويلة جداً وغير مقبولة أمنياً.
ووردبريس بيسمح لك بالتحكم الكامل في عمر النونس وتقليصه إلى ساعة واحدة فقط (3,600 ثانية)، أو زيادته للمحررين الذين يكتبون مقالات طويلة جداً عبر فلتر nonce_life:

<?php
// تقليص عمر النونس للعمليات المالية الحساسة إلى ساعتين فقط
add_filter('nonce_life', function(int $lifespan, string $action): int {
    if (str_starts_with($action, 'financial_transaction_')) {
        return 2 * HOUR_IN_SECONDS; // ساعتين فقط
    }

    return $lifespan; // الاحتفاظ بالقيمة الافتراضية لباقي الإجراءات
}, 10, 2);

معمارية الـ Nonces في أنظمة ووردبريس المنفصلة (Headless WordPress)

لو أنت بتبني مشروع ووردبريس بنظام **Headless** (الباك إند ووردبريس والفرونت إند مبني بـ Next.js أو Nuxt):
المتصفح لا يتواصل مع ووردبريس عبر النماذج الكلاسيكية، بل عبر طلبات fetch() لـ REST API أو GraphQL.

لحماية هذه الطلبات من الـ CSRF عندما يكون المستخدم مسجل دخوله عبر كوكيز الجلسة، يجب على تطبيق Next.js جلب الـ Nonce وتمريره إجبارياً في ترويسة الطلب:

X-WP-Nonce: abc123xyz

نواة ووردبريس مبرمجة في كلاس WP_REST_Server على فحص هذه الترويسة تلقائياً لمطابقة جلسة الكوكيز؛ فإذا تطابق النونس، يتم اعتماد الطلب بأمان مطلق.

الأسئلة الشائعة حول هجمات CSRF ورموز Nonces (FAQ)

1. ما هو هجوم CSRF باختصار وكيف يحدث؟

هو هجوم يتم فيه استغلال ثقة الموقع في متصفح المستخدم المسجل؛ حيث يقوم المهاجم بخداع متصفح الضحية لإرسال طلب خبيث في الخلفية ينفذ إجراءات غير مصرح بها نيابة عنه دون علمه.

2. ما هو دور الـ Nonce في الحماية من هجمات CSRF؟

يعمل كرمز سري مشفر ومؤقت يتم تضمينه في النماذج والروابط؛ وبما أن المواقع الخارجية لا تستطيع قراءة هذا الرمز بسبب سياسة المتصفحات (SOP)، فإن أي طلب مزور سيفشل لعدم احتوائه على الرمز الصحيح.

3. كم تبلغ فترة صلاحية الـ Nonce في ووردبريس افتراضياً؟

تتراوح صلاحية الـ Nonce في ووردبريس بين 12 إلى 24 ساعة افتراضياً (دورتين كل دورة 12 ساعة)، ويمكن تعديلها عبر فلتر nonce_life.

4. لماذا يفشل التحقق من النونس أحياناً إذا كان الموقع يستخدم إضافات كاش؟

لأن إضافات الكاش الثابت (Page Caching) تقوم بتخزين كود الـ HTML بالكامل بما فيه من رموز Nonce؛ وبعد مرور 24 ساعة تنتهي صلاحية النونس المخزن بالكاش، وتفشل كافة النماذج حتى يتم تفريغ الكاش.

5. ما هو الفرق بين check_admin_referer() و wp_verify_nonce()؟

دالة check_admin_referer() تفحص النونس وتوقف التنفيذ تلقائياً عبر wp_die() إذا كان غير صالح، بينما wp_verify_nonce() تعيد قيمة منطقية وتمنحك حرية كتابة معالجة خطأ مخصصة.

6. هل يغني الـ Nonce عن فحص صلاحيات المستخدم (Capabilities)؟

لا إطلاقاً؛ فالـ Nonce يثبت فقط أن الطلب صادر من واجهة موقعك، ولكنه لا يمنع مستخدماً عادياً (Subscriber) من إرسال طلب مخصص للمديرين، ولا بد من استخدام current_user_can() معاً.

7. كيف أقوم بتوليد Nonce لنموذج HTML عادي؟

باستدعاء دالة wp_nonce_field('my_action', 'my_nonce_field') داخل وسم <form> لتوليد الحقول المخفية تلقائياً.

8. كيف أضيف Nonce إلى رابط إجراء (URL Action)؟

باستخدام دالة wp_nonce_url($actionUrl, 'my_action') والتي تضيف معامل _wpnonce مشفر إلى الرابط تلقائياً.

9. ما هي الدالة المخصصة لفحص النونس في طلبات AJAX؟

هي دالة check_ajax_referer('my_action', 'security_param') والتي تتعامل تلقائياً مع طلبات الـ AJAX وترجع استجابة خطأ متوافقة.

10. كيف يتم تمرير النونس إلى أكواد الجافاسكريبت في الواجهة الأمامية؟

باستخدام دالة wp_create_nonce('my_action') وتمرير قيمتها عبر دالة wp_localize_script() أو تضمينها في كائن JSON آمن.

11. هل يرتبط الـ Nonce بمعرف المستخدم (User ID)؟

نعم، ووردبريس يدمج معرف المستخدم في معادلة توليد الـ Nonce؛ وبالتالي لا يمكن لمستخدم استخدام رمز نونس تم توليده لمستخدم آخر.

12. هل يعمل الـ Nonce للزوار غير المسجلين (Logged-out Users)؟

نعم، يقوم ووردبريس بتوليد نونس خاص بالزوار المجهولين برقم مستخدم 0، ولكنه يكون أقل أماناً لأن أي زائر آخر يمكنه مشاركة نفس النونس في نفس النافذة الزمنية.

13. لماذا ينصح بعدم استخدام طلبات GET في العمليات الحساسة؟

لأن طلبات GET يمكن استدعاؤها بسهولة عبر وسوم عادية مثل <img> أو <script> في مواقع خارجية، كما أنها تُسجل بالكامل في سجلات السيرفر والمتصفح مما يعرض البيانات للتسريب.

14. ماذا تعني القيمة 2 التي تعيدها أحياناً دالة wp_verify_nonce()؟

تعني أن النونس صالح ولكنه تم توليده في النصف الثاني من عمره الزمني (بين 12 و 24 ساعة مضت)، وتفيدك برمجياً إذا أردت تحديث النونس للمستخدم في الاستجابة.

15. كيف أحمي واجهات الـ REST API من هجمات الـ CSRF؟

بإلزام المتصفح بتمرير النونس في ترويسة الطلب X-WP-Nonce؛ حيث يقوم ووردبريس بفحصه تلقائياً لمطابقة جلسة الكوكيز الحالية.

16. ما هي سياسة Same-Origin Policy (SOP) وعلاقتها بالـ CSRF؟

هي آلية أمان أساسية في المتصفحات تمنع موقعاً معيناً من قراءة محتوى واستجابات موقع آخر يختلف عنه في النطاق أو البروتوكول، وهي السبب الذي يمنع المهاجم من سرقة النونس.

17. كيف تساهم علامة SameSite في حماية الكوكيز من CSRF؟

تمنع المتصفح من إرسال الكوكيز مع الطلبات الموجهة عبر المواقع (Cross-site Requests) عند تعيينها كـ Lax أو Strict، مما يعطل هجوم الـ CSRF على مستوى المتصفح.

18. هل يمنع استخدام النونس هجمات الـ XSS؟

لا، النونس يحمي من CSRF فقط؛ وإذا كان موقعك مصاباً بثغرة XSS، فإن المهاجم يستطيع قراءة محتوى الصفحة بالكامل وسرقة الـ Nonce واستخدامه بسهولة.

19. كيف أتأكد من أن كود إضافتي خالٍ من ثغرات CSRF؟

بمراجعة كافة دوال معالجة الطلبات والتأكد من أنها تتحقق من check_admin_referer() أو check_ajax_referer() قبل قراءة أو تعديل أي بيانات في قاعدة البيانات.

20. ما هي القاعدة الذهبية التي يجب أن يحفظها كل مبرمج ووردبريس؟

“لا تصدق أي ريكوست بدون النونس، ولا تنفذ أي أمر بدون فحص الصلاحية؛ فهذا القفل المزدوج (Twin-Lock) هو الحصن المنيع الذي يحمي مديري موقعك من فخاخ الـ CSRF الخبيثة!”

الصورة الرمزية لـ Mohamed Abozaid

م. محمد أبو زيد

WordPress Architect & Enterprise Consultant

مهندس برمجيات متخصص في تطوير حلول ووردبريس المتقدمة، معمارية Block Themes، ومحرر Gutenberg، وتحسين الأداء لمواقع الشركات الكبرى في مصر والخليج العربي.


اترك تعليقاً