我在清理用户输入和正确显示代码时遇到了问题。
使用bleach清理用户数据,它将
< ```a < b```
至
< ```a < b```
然后markdown将markdown文本转换为HTML
markdown.markdown(u'<\n ```a < b```')
输出结果是
<p><\n <code>a &lt; b</code></p>
我知道发生这种情况是因为第一个<被认为是HTML,但代码块中的所有内容都被转义,因为您希望显示它,而不是解释它。
有什么建议或者其他专门清理markdown的库吗?
发布于 2014-01-11 03:34:11
漂白剂是HTML消毒剂,而不是降价消毒剂。如果你想清理网站上来自不受信任用户的输入,这是可以理解的。但是,您通常会对markdown的输出(即HTML)运行bleach,而不是对markdown文本本身运行bleach。
sanitized_html = bleach.clean(markdown.markdown(some_text))
接下来,将示例markdown文本传递给Python-Markdown。你会得到完全可以接受的结果。事实上,您的输出(首先使用漂白剂)实际上是不正确的。注意,代码现在包含&lt;
,它将在浏览器中显示为<
而不是<
。您真正想要的输出是:
<p>< <code>a < b</code></p>
这正是Python-Markdown为您提供的开箱即用的功能。Python-Markdown的dingus显示给定输入的HTML源和预览。你可能想用它来理解我的意思。
如果你担心用户提交不好的markdown会破坏事情,你可能会很高兴知道Python-Markdown声明的goals之一是适合“在web服务器环境中使用的(从不引发异常,从不写入stdout等)”。换句话说,错误的用户输入不应该使您的服务器崩溃。当然,他们可以注入恶意的html/javascript,但这就是Bleach在markdown从用户输入构建html之后的用途。
最后一点评论。是的,我知道Python-Markdown有一个"safe_mode“。然而,这是一个不幸的命名功能。一个更贴切的名字可能是"strip_html“或"escape_html”(这两个名字都可以)。作为Python-Markdown的主要开发者,我推荐Bleach来清理来自不受信任用户的输入。
https://stackoverflow.com/questions/21052233
复制相似问题