2014-01-10 30 views
0

我在清理用户输入和正确显示代码时遇到了问题。清理用户使用代码创建降价

用户数据进行清洗bleach,即转换

< ```a < b``` 

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

然后降价转换降价文本到HTML

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

,输出是

我想到了这种情况,因为第一个<被认为是HTML,但是代码块中的所有内容都会被转义,因为您希望它被显示,而不是被解释。

任何建议或其他库专门清理降价?

+0

你期待什么样的输出?这看起来非常像我期望的。 –

回答

3

漂白剂是一个HTML消毒剂,而不是降价消毒剂。如果您想净化来自您网站上不受信任的用户的输入,这是可以理解的。但是,您通常会在markdown(这是HTML)的输出上运行漂白,而不是在降价文本本身上。

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

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

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

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

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

最后一个评论。是的,我知道Python-Markdown有一个“safe_mode”。但是,这是一个不幸的命名功能。更合适的名称可能是“strip_html”或“escape_html”(它也可以)。作为Python-Markdown的主要开发人员,我推荐使用Bleach来清理不受信任的用户的输入。

+0

使用Bleach清理降价输出的问题在于,您必须指定要允许或拒绝的所有标记和属性,这样可以防止使用扩展名输出带有类,脚本或任何您想要的特殊标记的扩展名,或者只是禁止该用户完全不使用HTML标签。如果你通过'嗨'通过降价输出' \ n \ n

嗨>

',如果你现在通过漂白,擦净的脚本标记最终会超出段落。 – Zequez