تنظيف سلسلة HTML حفظ بعض العلامات والسمات
-
30-09-2019 - |
سؤال
بعد أن قمت بتنفيذ وظائف التعقيم الخاصة بي (وفقًا للتفاصيل المطلوبة) ، قرر مديري تغيير المدخلات المقبولة. الآن يريد الاحتفاظ ببعض العلامات المحددة وسماتها. اقترحت تنفيذ لغة تشبه BBCode وهي IMHO أكثر أمانًا ، لكنه لا يريد ذلك لأنه سيكون من العمل كثيرًا.
هذه المرة أود أن أبقي الأمر بسيطًا حتى لا أقتله في المرة القادمة التي يطلب مني فيها تغيير هذا الشيء مرة أخرى. وأنا أعلم أنه سوف.
هل يكفي استخدام أولاً strip_tags
مع معلمة العلامة للحفاظ عليها ثم htmlentities
?
المحلول
strip_tags
لا يؤدي بالضرورة إلى محتوى آمن. strip_tags
تليها htmlentities
سيكون آمنًا ، حيث أن أي شيء ترميز HTML آمن ، لكنه لا معنى له.
إما أن يقوم المستخدم بإدخال نص عادي ، وفي هذه الحالة يجب إخراجه باستخدام htmlspecialchars
(في التفضيل إلى htmlentities
) ، أو يقومون بإدخال علامة HTML ، وفي هذه الحالة تحتاج إلى تحليلها بشكل صحيح ، وإصلاح العلامات المكسورة وإزالة العناصر/السمات التي ليست في قائمة آمنة.
إذا كان هذا هو ما تريده ، فاستخدم مكتبة موجودة للقيام بذلك (على سبيل المثال. htmlpurifier). لأنها ليست مهمة تافهة ، وإذا أخطأت ، فقد أعطيت نفسك ثقوب أمان XSS.
نصائح أخرى
يمكنك الاحتفاظ بعلامات محددة باستخدام strip_tags
مع هذا بناء الجملة: strip_tags($text, '<p><a>');
هذا المقتطف من شأنه تجريد جميع العلامات إلا p
و a
. يتم الاحتفاظ بالسمات للعلامات التي سمحت بها (p
و a
في المثال أعلاه).
ومع ذلك ، هذا لا يعني أن السمات آمنة. هل يريد سمات محددة أم أنه يريد الاحتفاظ بها جميعًا على العلامات المسموح بها؟ بالنسبة للحالة الأولى ، ستحتاج إلى تحليل كل علامة وإزالة تلك المطلوبة ، وتعقيم القيم. للحفاظ على جميع السمات على العلامات المسموح بها ، لا تزال بحاجة إلى تعقيمها. أود أن أوصي بالركض htmlentities
على قيم السمة لتعقيمها (للعرض ، سأفترض).