【问题标题】:Cleaning user created markdown with code in it清洁用户创建了带有代码的降价
【发布时间】:2014-01-29 21:26:36
【问题描述】:

我在清理用户输入和正确显示代码时遇到问题。

bleach清理用户数据,转换

< ```a < b```

&lt; ```a &lt; b```

然后markdown将markdown文本转成HTML

markdown.markdown(u'&lt;\n ```a &lt; b```')

输出是

<p>&lt;\n <code>a &amp;lt; b</code></p>

我发现这是因为第一个

有什么专门清理 Markdown 的建议或其他库吗?

【问题讨论】:

  • 您期待什么样的输出?这看起来很像我所期望的。

标签: python markdown


【解决方案1】:

Bleach 是一种 HTML 消毒剂,而不是 Markdown 消毒剂。如果您想清理网站上不受信任用户的输入,这是可以理解的。但是,您通常会在 markdown 的输出(即 HTML)而不是 markdown 文本本身上运行漂白。

sanitized_html = bleach.clean(markdown.markdown(some_text))

继续将您的示例 Markdown 文本传递到 Python-Markdown。你会得到完全可以接受的结果。事实上,您的输出(首先使用漂白剂)实际上是不正确的。请注意,代码现在包含&amp;amp;lt;,它将在您的浏览器中显示为&amp;lt;,而不是&lt;。你真正想要的输出是:

<p>&lt; <code>a &lt; b</code></p>

这正是 Python-Markdown 为您提供的开箱即用的功能。 Python-Markdown 的 dingus 显示给定输入的 HTML 源代码和预览。你可能想用它来看看我的意思。

如果您担心用户提交会破坏事情的错误降价,您可能会很高兴知道 Python-Markdown 声明的goals 之一适合“在 Web 服务器环境中使用(永远不要引发异常,永远不要写入标准输出等)”换句话说,错误的用户输入不应该使您的服务器崩溃。当然,他们可以注入恶意的 html/javascript,但这就是在 markdown 从用户输入构建 html 之后 Bleach 的用途。

最后的评论。是的,我知道 Python-Markdown 有一个“safe_mode”。然而,这是一个不幸的命名功能。更贴切的名称可能是“strip_html”或“escape_html”(两者都可以)。作为 Python-Markdown 的主要开发者,我推荐使用 Bleach 来清理来自不受信任用户的输入。

【讨论】:

  • 使用 Bleach 清理 Markdown 输出的问题是,您必须指定要允许或拒绝的所有标签和属性,这会阻止您使用输出带有类、脚本或无论您想要什么,或者根本不允许用户使用 HTML 标签。它还会弄乱布局,如果你通过降价传递&lt;script&gt;&lt;/script&gt; Hi,它会输出&lt;script&gt;&lt;/script&gt;\n\n&lt;p&gt;Hi &amp;gt; &lt;/p&gt;,如果你现在通过漂白,净化后的脚本标签最终会出现在段落之外。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2013-12-27
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多