سؤال

أعمل حاليًا على تطبيق يتطلب من المستخدمين إرسال المشاركات والتعليقات التي يتم عرضها على الموقع.كما نعلم جميعًا أنه لا يمكن الوثوق بإدخال المستخدم، لذا استخدمت htmlspecialchars($string,ENT_QUOTES) لمعالجة مشاركات المستخدم وتعليقاته.

الآن، أريد تجاهل بعض علامات HTML معينة.مثل <b><br /> وعدد قليل من العلامات.كيف يمكنني القيام بذلك بحيث يتجاهل htmlspecialchars بعض العلامات بينما يقوم بتصفية العلامات الأخرى.

هل كانت مفيدة؟

المحلول

الحل أ)
استخدم strip_tags بدلاً من htmlspecialchars، وأضف العلامات المطلوبة إلى القائمة البيضاء.
الحل الأفضل ب)
استخدم BBcodes، وقم بإعطاء أسماء مستعارة للعلامات المطلوبة، على سبيل المثال:[b]عريض[/b]

نصائح أخرى

ومن <قوية> جدا، صعبة للغاية لتسمح فقط بعض العلامات HTML دون السماح لأي إمكانية حقن النصي أو ما شابه ذلك.

وأود أن أوصي فعلا تجنب هذا وباستخدام شيء أن يولد HTML مثل هذا الرمز UBB محلل (أو ما شابه). أو حتى تخفيض السعر (مع خيار HTML إيقاف).

وهذا لا يعطي مجالا للمهاجمين لتصل إلى موقع الويب الخاص بك، وهو أمر مهم جدا إذا كان يواجه العامة.

إذا كنت تسمح حتى بعض HTML من خلال، وهناك احتمالات بأن مهاجم العزم سوف تجد وسيلة حوله.

<اقتباس فقرة> تعبت من استخدام ال BBCode بسبب المشهد الحالي من نقص أو انعدام الأمن المرشحات HTML -> <وأ href = "http://htmlpurifier.org/" يختلط = " نوفولو noreferrer "> HTML تنقية

<اقتباس فقرة> تنقية HTML هي مكتبة تصفية HTML متوافق مع المعايير كتب في PHP. وHTML تنقية ليس فقط إزالة كافة التعليمات البرمجية الخبيثة (المعروف باسم XSS) مع دققنا جيدا، القائمة البيضاء بعد متساهلة آمنة، ...

ويمكنك استبدال سلسلة مقتبسة إلى إعادة إدراج العلامات المسموح بها. لبه <b> على سبيل المثال:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

وأود أن تسمح فقط، كاملة علامات واضحة للغاية في أن يكونوا آمنين قدر الإمكان. بمعنى آخر. لا تستخدم التعابير العادية إذا لم يكن لديك ل، يمكن أن يؤدي إلى الخلل سيئة للغاية.

وأوصي بشدة استخدام Zend_Filter لتصفية من خلال إدخال المستخدم. على وجه التحديد، انظر: http://framework.zend.com/ دليل / EN / zend.filter.html # zend.filter.introduction.using

وهذه ليست بسيطة كما قد شيء لأنه لا htmlspecialchars() htmlentities() تقدم أي خيارات لتجاهل بعض العلامات (على حد سواء وظائف لا أعرف حتى معنى لمفهوم <م> علامات ).

هل يمكن استخدام بعض الوسائل الأخرى للسماح للمستخدمين لتنسيق وظائفهم، على سبيل المثال، ال BBCode و <لأ href = "http://en.wikipedia.org/wiki/Textile_ (markup_language) "يختلط =" نوفولو noreferrer "> المنسوجات أو تخفيض السعر . هناك موزعي PHP متاح لجميع من لهم.

إذا سيكون لديك لعصا مع علامات HTML هل يمكن اللجوء إلى بعض تجهيزها أن تنسيقه العلامات يسمح بحيث لن تتأثر <لأ href = "http://de.php.net/manual/ EN / function.htmlspecialchars.php "يختلط =" نوفولو noreferrer "> htmlspecialchars() . يمكنك بعد ذلك المعالجة اللاحقة نتيجة لتغيير الخلفي التنسيق إلى HTML-علامات العادية. يتصور نموذج التالي هذه العملية بسيطة <a> العلامة. يرجى أن يكون على علم بأن HTML تجهيز مع التعابير العادية هي عرضة للخطأ وليس دائما وسيلة للذهاب - أنا سوف تستخدم فقط لأغراض التبسيط في هذا المثال

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

وهذه هي مجربة وسيتطلب بالتأكيد الكثير من العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top