سؤال

لقد اكتشفت مؤخرًا مشكلة حيث يمكن للأشخاص الذين يستخدمون رمز BB لإدخال الروابط معالجةها.

من المفترض أن يدخلوا شيئًا مثل:

[LINK=http://www.domain.com]example text[/LINK]

ومع ذلك ، يمكنهم إدخال شيء كهذا لجعل لون الرابط أحمر:

[LINK=http://www.domain.com 'span style="color:red;"']example text[/LINK]

هذا هو الكود الذي يحوله:

$text = preg_replace("/\[LINK\=(.*?)\](.*?)\[\/LINK\]/is", "<a href='$1' target='_blank'>$2</a>", $text);

كان شخص آخر لطيفًا بما يكفي لتوفير حل لمشكلة مماثلة للغاية ، لكنهم يريدون مني أن أبدأ سؤالًا جديدًا لهذا الغرض. حلهم يحتاج فقط التكيف. لقد جربت نفسي ولكني حقًا لا أستطيع عمله. كيف توقف معالجة رمز BB؟

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

المحلول

preg_replace_callback("/\\[LINK\=(.*?)\\\](.*?)\\[\/LINK\\]/is",
    function (array $matches) {
        if (filter_var($matches[1], FILTER_VALIDATE_URL))
            return '<a href="'.
                htmlspecialchars($matches[1], ENT_QUOTES).
                '" target="_blank">'.
                htmlspecialchars($matches[2])."</a>";
        else
            return "INVALID MARKUP";
    }, $text);

استخدم رد اتصال للتحقق من صحة عنوان URL ولا تنسى htmlspecialchars.

نصائح أخرى

أعتقد أن أبسط وأفضل حل هو تشغيل عنوان URL htmlspecialchars() للهروب من الشخصيات الغريبة. وبهذه الطريقة ، لن يتم وضعها مباشرة في المصدر ، ولكن سيتم هروبها أولاً ، لذلك لن يكون قادرًا على اختراق من href="...".

بدلاً من استخدام Regex Reply ، استخدم مطابقة Regex لاستخراج المعلومات التي تريدها ، في هذه الحالة الرابط ونص الارتباط.

ثم اكتب هذه المعلومات بالتنسيق الصحيح. يجب أن يلغي ذلك الفرصة للحصول على بيانات غريبة في الإخراج.

يمكنك حتى التحقق من المتغيرات المزدوجة قبل استخدامها للتأكد من أنها لا تحتوي على أي HTML.

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