htmlentities() vs htmlspecialchars() في PHP: شرح شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

htmlentities() vs. htmlspecialchars(): معركة عمالقة التعقيم في PHP

\n\n

إذا سبق لك التعامل مع عرض بيانات المستخدمين على صفحة ويب، فبالتأكيد سمعت عن الدالتين htmlentities() و htmlspecialchars(). هما أداتا PHP الأساسيتان للحماية من هجمات XSS (Cross-Site Scripting) ولعرض رموز HTML بشكل صحيح. لكن ما الفرق بينهما؟ أي منهما مناسب للمبتدئ، وأيهما للمحترف؟ دعنا نفهم الأمر مرة واحدة وإلى الأبد.

\n\n

تخيل أنك تبني مدونة بـ PHP، وأحد المستخدمين أدخل تعليقًا: <script>alert('XSS')</script>. إذا قمت بعرضه مباشرة، سيقوم المتصفح بتنفيذ الكود. كارثة! هنا يأتي دور htmlspecialchars() و htmlentities(). لكن كل منهما يعمل بطريقة مختلفة.

\n\n

ما المشترك بين htmlspecialchars() و htmlentities()؟

\n\n

كلتا الدالتين تقومان بتحويل الرموز الخاصة في HTML إلى كيانات HTML (entities). على سبيل المثال:

\n
    \n
  • & (علامة العطف) → &amp;
  • \n
  • < (أصغر من) → &lt;
  • \n
  • > (أكبر من) → &gt;
  • \n
  • " (الاقتباس المزدوج) → &quot;
  • \n
  • ' (الاقتباس المفرد) → &#039; (أو &apos; حسب العلم)
  • \n
\n\n

بدونهما، أي إدخال يحتوي على أقواس زاوية أو علامات عطف سيكسر تنسيق الصفحة أو يفتح الباب أمام المخترقين.

\n\n

الفرق الرئيسي: نطاق التحويل

\n\n

هنا يكمن السر. htmlspecialchars() هي المقاتل الاقتصادي. تقوم بتحويل خمسة رموز أساسية فقط لها معنى مباشر في HTML:

\n
    \n
  • & → &amp;
  • \n
  • < → &lt;
  • \n
  • > → &gt;
  • \n
  • " → &quot;
  • \n
  • ' → &#039; (إذا تم تفعيل العلم ENT_QUOTES)
\n\n

أما htmlentities() فهي المثالية. تقوم بتحويل جميع الرموز التي لها كيانات HTML مقابلة. ليس فقط الأقواس الزاوية، بل أيضًا رموز العملات (€, £, ¥)، العلامات الرياضية (∑, ∂)، الحروف ذات العلامات التشكيلية (é, ñ, ü)، وحتى الرموز التعبيرية (☺).

\n\n

مثال بسيط: الفرق عمليًا

\n\n

لننظر إلى الكود. افترض أن لدينا نصًا بالفرنسية:

\n\n
<?php\n$text = "Café & thé <script>alert('test')</script>";\necho "htmlspecialchars: " . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . "<br>";\necho "htmlentities: " . htmlentities($text, ENT_QUOTES, 'UTF-8');\n?>
\n\n

النتيجة:

\n
htmlspecialchars: Café & thé <script>alert('test')</script>\nhtmlentities: Café & thé <script>alert('test')</script>
\n\n

في هذا المثال لا يوجد فرق، لأن الحروف مثل "é" ليس لها معنى خاص في HTML. لكن دعنا نجرب مع رموز لها كيانات:

\n\n
<?php\n$text = "€ 100 <b>bold</b>";\necho "htmlspecialchars: " . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . "<br>";\necho "htmlentities: " . htmlentities($text, ENT_QUOTES, 'UTF-8');\n?>
\n\n

النتيجة:

\n
htmlspecialchars: € 100 <b>bold</b>\nhtmlentities: &euro; 100 <b>bold</b>
\n\n

هل ترى؟ htmlentities() حولت رمز اليورو "€" إلى كيان &euro;. بينما htmlspecialchars() تركته كما هو. لماذا؟ لأن "€" ليس رمزًا خطيرًا في HTML — المتصفح سيعرضه بشكل صحيح حتى بدون تعقيم.

\n\n

متى تستخدم htmlspecialchars()؟

\n\n

هذا هو اختيارك الافتراضي. استخدم htmlspecialchars() في 99% من الحالات عند عرض بيانات المستخدم

المدونات

توصيات الكتب