PHP / أساسي: القيم وأسس الطلب / الدرس 6
التهريب والترويسات وبناء الاستجابة
افصل بيانات المجال من تمثيل HTML وJSON. ابنِ القرار قبل الإخراج وافهم لماذا قد تمنع بايتات مبكرة تعديل الترويسات.
في هذه الصفحة
أهداف الدرس
- تهريب النص للسياق المقصود.
- فصل بيانات الاستجابة من إرسال الجسم.
- شرح توقيت الترويسات وفشل التسلسل.
مكان التهريب عند تحول البيانات لتمثيل
احفظ النص المتحقق منه لا HTML مهرباً. عند العرض تحمي htmlspecialchars بسياسة UTF-8 وصفات مناسبة النص والصفة المقتبسة، لا JavaScript أو CSS أو قرار بروتوكول أو وسوماً اعتباطية. فضّل الحدود البسيطة ولا تبنِ برنامجاً من نص. قد يصح عنوان بأقواس ويعرض حرفياً. ليس التهريب تصريحاً أو تحققاً؛ فقد تعرض صفحة آمنة سعراً خاطئاً أو سجلاً غير مأذون.
<?php
declare(strict_types=1);
$title = '<label title="x">&</label>';
echo htmlspecialchars($title, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8"), PHP_EOL;
<label title="x">&</label>
تصير العلامات كيانات؛ والمخرج تمثيل لهذا السياق لا بديلاً لبيانات المجال.
تقرير الحالة والترويسات قبل الجسم
للاستجابة حالة وترويسات وجسم. يجب تنفيذ دوال الترويسات قبل اعتماد الإخراج في واجهة الخادم. قد ترسل echo أو مسافة أو BOM أو تحذير بايتات مبكرة. اترك الملفات الخالصة بلا وسم إغلاق لتقليل الإخراج العرضي. لا تجعل التخزين المؤقت عذراً للخلط؛ فهو أداة مقصودة لا يلغي العمر ولا يوقف التنفيذ بعد التحويل.
تمثيل الاستجابة قبل إرسالها
يمكن لمصفوفة تمثيل الاستجابة محلياً. يبني المثال جسم JSON بفشل صريح ثم يسجل النوع والحالة، ويطبع النموذج في CLI فيفحص البناء لا تسليم HTTP. يطبق المحول الحالة والترويسات مرة ويرسل الجسم مرة ويعود أو ينهي وفق عقده. اختر للتحويل وجهة صالحة وأنهِ المسار؛ فلا تمنع Location وحدها عملاً حساساً لاحقاً.
<?php
declare(strict_types=1);
$body = json_encode(["title" => "PDO", "seats" => 2], JSON_THROW_ON_ERROR);
$response = ["status" => 200, "headers" => ["Content-Type" => "application/json; charset=UTF-8"], "body" => $body];
echo $response["status"], PHP_EOL;
echo $response["headers"]["Content-Type"], PHP_EOL;
echo $response["body"], PHP_EOL;
200
application/json; charset=UTF-8
{"title":"PDO","seats":2}
لا ترسل ترويسة خادم؛ فالبناء وJSON حتميان ومستقلان عن واجهة الويب.
لـJSON التزامات شكل وترميز
لا يثبت نجاح JSON مطابقة مخطط المستدعي. ميّز القائمة والخريطة وحدد null والحقول والخطأ. تحوّل JSON_THROW_ON_ERROR المشكلة لاستثناء صريح يعالج دون مكدس داخل JSON جزئي. لا تخلط تحذيراً بالجسم وتعلن application/json. قرر استجابة كاملة قبل الإرسال ليختار الفشل حالة وجسماً آمنين. وافصل التسلسل من ربط SQL وتهريب HTML.
فحص البايتات وسلوك المتصفح منفصلين
يقارن فحص الوحدة النص أو النموذج بدقة، ويفحص HTTP المعزول الحالة والنوع والكوكيز والتحويل والعرض. لا يثبت CLI تسليم كوكيز ولا يثبت العرض الحالة. عند سبق الترويسات احفظ موضع الإخراج الأول وأزل السبب لا كل التحذيرات. إظهار الأخطاء وتسجيلها إعداد مسؤول؛ لا تكشف الخاص لصفحة تشخيص سهلة. استخدم حالات مصطنعة محلية.
الأخطاء الشائعة وإصلاحها
تهريب HTML مرتين
- لماذا يحدث؟
- حفظ التمثيل المعروض كأصل.
- كيف تصلحه؟
- حفظ النص وتهريبه عند كل حد مرة.
- كيف تتجنب تكراره؟
- اختبار العنوان في HTML وJSON منفصلين.
استمرار الكتابة بعد التحويل
- لماذا يحدث؟
- اعتبار Location إنهاءً للتنفيذ.
- كيف تصلحه؟
- العودة أو الإنهاء عمداً بعد القرار.
- كيف تتجنب تكراره؟
- التحقق من غياب أثر لاحق لمسار التحويل.
إرجاع نقطة JSON نص تحذير
- لماذا يحدث؟
- طباعة الخطأ في مجرى الاستجابة.
- كيف تصلحه؟
- إصلاح التحذير ومعالجة حد آمنة.
- كيف تتجنب تكراره؟
- فحص الحالة والنوع وتحليل الجسم معاً.
اختبر فهمك
1. هل تجعل htmlspecialchars عنوان التحويل آمناً؟
اعرض الحل المشروح
لا؛ ترمز HTML لا سياسة الوجهة. حلل وافحص البروتوكول والأصل والمسار. وعند عرض الرابط اهربه للصفة المقتبسة بعد سياسة العنوان.
2. ماذا يثبت مثال نموذج الاستجابة؟
اعرض الحل المشروح
يثبت البناء المحلي للقيم والنوع وJSON، ولا يرسل HTTP أو يفحص تفسير المتصفح. أضف اختبار محول معزولاً عند دخول الترويسات والتحويل والكوكيز.
أهم ما تعلمته
- افصل الأصل من التمثيل حسب السياق.
- ابنِ استجابة كاملة قبل إرسال البايتات.