【问题标题】:Lightweight markup language for Python用于 Python 的轻量级标记语言
【发布时间】:2010-11-16 11:04:47
【问题描述】:

编写 Python Web 应用程序时,我想创建一个文本区域,用户可以在其中输入轻量级标记语言的文本。文本将被导入到 html 模板并在页面上查看。今天我用这个命令创建了textarea,它允许用户输入任何(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()])

我怎样才能改变这一点,以便只允许一些(安全的,最终轻量级的)标记?欢迎所有建议,包括消毒剂,只要它可以轻松与 Python 集成。

【问题讨论】:

    标签: python html markup


    【解决方案1】:

    您可以使用 restructured text 。我不确定它是否有清理选项,但 Python 很好地支持它,它会生成各种格式。

    【讨论】:

      【解决方案2】:

      使用 python markdown 实现

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

      它非常灵活,你可以使用各种扩展,创建你自己的等等。

      【讨论】:

      • 我使用 iPython 进行了尝试,将文本定义为一些包含脚本标签的 html。我得到了一个奇怪的输出:文本仍然是相同的,并且 html = '[HTML_REMOVED]' 我还需要做什么才能删除危险标签?我尝试了所有三种模式,结果相同。
      • 运行了一些测试,我意识到我不能输入任何 html 标签,只能输入 markdown 语法,同时我会得到安全的输出。谢谢,成功了!
      • 来自文档要替换 HTML,请设置 safe_mode="replace"(safe_mode=True 仍然适用于与旧版本的向后兼容)。 HTML 将替换为 markdown.HTML_REMOVED_TEXT 中定义的文本,默认为 [HTML_REMOVED]。用其他东西替换 HTML:markdown.HTML_REMOVED_TEXT = "--RAW HTML IS NOT ALLOWED--"
      【解决方案3】:

      这个简单的清理功能使用白名单,与python-html-sanitizer-scrubber-filter的解决方案大致相同,但也允许限制属性的使用(因为您可能不希望有人使用,其中@987654322 @属性):

      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:', '')
      

      【讨论】:

        猜你喜欢
        • 2016-05-15
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2011-06-29
        • 2011-05-17
        • 2010-10-14
        • 2013-07-31
        相关资源
        最近更新 更多