سؤال

هل هناك تنفيذ PHP للتسريح مناسبة للاستخدام في التعليقات العامة؟

في الأساس، يجب أن تسمح فقط بمجموعة فرعية من بناء جملة التخطيط (جريئة، مائلة، وروابط، وحظر كتلة، وكتل التعليمات البرمجية والقوائم)، وتقوم بتعليم جميع مشاكل HTML (أو ربما هربا منها؟)

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

نحن نستخدم PHP تخفيضات إضافية لبقية الموقع، لذلك علينا بالفعل استخدام محلل ثانوي (النسخة غير "غير"، لأن الأمور مثل دعم الحاشية الحاشية غير ضرورية) .. يبدو أيضا تجهيز أجمل فقط ال *bold* النص وبعد أن نجا كل شيء ل &lt;a href="etc"&gt;, ، من توليد <b>bold</b> النص ومحاولة تجريد البتات التي لا نريدها ..

أيضا، في ملاحظة ذات صلة، نحن نستخدم عنصر تحكم WMD للموقع "الرئيسي"، ولكن للتعليقات، ما هي الخيارات الأخرى هناك؟ المعاينة JavaScript WMD هي لطيفة، ولكنها ستحتاج إلى نفس "الخصي" كمعالج PHP تخفيض (لا يمكن عرض الصور وما إلى ذلك، وإلا فإن شخص ما سيقدم وسيشكل شخص ما "كسر")

حاليا خطتي هي استخدام PHP-Markdown -> طريقة HTML Santiser، وتحرير WMD لإزالة بناء جملة الصورة / عنوان showdown.js - ولكن يبدو أن هذا قد فعلت عدة مرات من قبل ..

في الأساس:

  • هل هناك تنفيذ علامة "آمنة" في PHP؟
  • هل هناك محرر HTML / JavaScript علامة تجارية يمكن أن يكون لها نفس الخيارات معطلة بسهولة؟

تحديث: انتهى بي الأمر ببساطة تشغيل markdown() الإخراج من خلال HTML لتنقية.

وبهذه الطريقة تم فصل التسوية منفصلة عن الإخراج Sanitation، وهو أبسط بكثير (أسواق التعليمات البرمجية غير المعفونة في الغالب) أكثر أمانا (أنت لا تحاول القيام بكل من العرض والاستقرارات في وقت واحد)، وأكثر مرونة (يمكنك الحصول على العديد من الأسلاك المستويات، قل تكوين LAX أكثر للمحتوى الموثوق به، وإصدار أكثر صرامة للتعليقات العامة)

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

المحلول

PHP Markdown لديه خيار المطهر، ولكن لا يبدو أنه يتم الإعلان عنها في أي مكان. نلقي نظرة على الجزء العلوي من Markdown_Parser فئة في markdown.php (يبدأ في السطر 191 في الإصدار 1.0.1m). نحن مهتمون بالأسلون 209-211:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

إذا قمت بتغيير تلك إلى true, والتحول والكيانات، على التوالي، يجب أن تهرب بدلا من إدراج حرفي. لا يبدو أن هناك أي طريقة مدمجة لتغيير تلك (على سبيل المثال، عبر المنشئ)، ولكن يمكنك دائما إضافة واحدة:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

لاحظ أن الدالة أعلاه تنشئ محلل جديدا على كل تشغيل بدلا من التخزين المؤقت عليه مثل المقدمة Markdown وظيفة (خطوط 43-56) لا، لذلك قد يكون قليلا على الجانب البطيء.

نصائح أخرى

جافا سكريبت محرر فرضية:

  • استخدم محرر علامة تجارية مدفوعة جافا سكريبت، على سبيل المثال، بناء على المواجهة
  • قم بإزالة جميع الرموز والقرائن المرئية من شريط الأدوات للعناصر غير المرغوب فيها
  • قم بإعداد مرشح JavaScript لتنظيف العلامات غير المرغوب فيها عند التقديم
  • اختبار وتصلب جميع التغييرات وجافا سكريبت والمرشحات محليا على جهاز الكمبيوتر الخاص بك
  • مرجع تلك المرشحات في البرنامج النصي لتقديم PHP، للقبض على جانب الخادم.
  • قم بإزالة جميع المراجع إلى العناصر غير المرغوب فيها من المساعدة / البرامج التعليمية

لقد قمت بإنشاء محرر تخطيطي في JavaScript، لكنه قام بتعزيز الميزات. التي استغرقت جزء كبير من الوقت ومراجعات SVN. لكنني لا أعتقد أنه سيكون من الصعب تغيير محرر تخطيطي للحد من HTML المسموح به.

إذا كنت تتطلع إلى كتابة المحلل المحلل الخاص بك، فلماذا لا تستخدم بنية BBCode.

عند تقديم التعليقات / (المستخدمين)، تحتاج إلى تطهير النص باستخدام mysql_escape_real_string ()، نعم هناك وظائف أخرى ولكن هذا سوف يتوقف عن أي حقن JS.

ماذا عن تشغيل HTMLSPecialChars على إدخال المستخدم المدخلات، قبل معالجة ذلك من خلال التسوية؟ يجب أن يهرب من أي شيء خطير، ولكن اترك كل ما يفهمه الشاشة.

أحاول التفكير في القضية حيث لن يعمل هذا ولكن لا يمكنك التفكير في أي شيء خارج اليد.

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