سؤال

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

my_text = cgidata.getvalue('my_text', 'default_text')
ftable.AddRow([Label(_('Enter your text')),
               TextArea('my_text', my_text, rows=8, cols=60).Format()])

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

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

المحلول

استخدم الثعبان تخفيض السعر تنفيذ

import markdown
mode = "remove" # or "replace" or "escape"
md = markdown.Markdown(safe_mode=mode)
html = md.convert(text)

وأنها مرنة جدا، يمكنك استخدام الإضافات المختلفة، وخلق الخاصة بك وغيرها.

نصائح أخرى

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

وهذه وظيفة التعقيم بسيطة يستخدم القائمة البيضاء وهي تقريبا نفس حل بيثون أتش تي أم أل -sanitizer-الغسيل تصفية ، ولكنه يسمح أيضا للحد من استخدام السمات (منذ ربما كنت لا تريد شخص ما للاستخدام، من بين أمور أخرى، السمة style):

from BeautifulSoup import BeautifulSoup

def sanitize_html(value):
    valid_tags = 'p i b strong a pre br'.split()
    valid_attrs = 'href src'.split()
    soup = BeautifulSoup(value)
    for tag in soup.findAll(True):
        if tag.name not in valid_tags:
            tag.hidden = True
        tag.attrs = [(attr, val) for attr, val in tag.attrs if attr in valid_attrs]
    return soup.renderContents().decode('utf8').replace('javascript:', '')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top