Django HTML:清理一组标记,但允许<;中的所有标记;代码>;阻碍
我正在使用Django+Markdown来处理用户输入。降价过滤器生成的文本需要是“安全的”,并且不受django的自动转义机制的保护,所以我必须自己转义用户输入。我现在就是这样做的:Django HTML:清理一组标记,但允许<;中的所有标记;代码>;阻碍,django,markdown,html-sanitizing,Django,Markdown,Html Sanitizing,我正在使用Django+Markdown来处理用户输入。降价过滤器生成的文本需要是“安全的”,并且不受django的自动转义机制的保护,所以我必须自己转义用户输入。我现在就是这样做的: {{ text|force_escape|markdown:"codehilite" }} 但是,如果代码>文本< /代码>包含了一个被标记为“代码> >代码> 的东西,它也会逃脱,输出将是相当丑陋的(例如,在将它传递给标记之前不要逃避输入。正如您所发现的,在某些情况下,这会打断用户的输入。并且,它不能确保安全
{{ text|force_escape|markdown:"codehilite" }}
<>但是,如果代码>文本< /代码>包含了一个被标记为“代码> >代码> <代码>的东西,它也会逃脱,输出将是相当丑陋的(例如,在将它传递给标记之前不要逃避输入。正如您所发现的,在某些情况下,这会打断用户的输入。并且,它不能确保安全性:例如,考虑“<代码> [CLICMe])。(javascript:alert%28%22xss%22%29)”
相反,正确的方法是在安全模式下使用Markdown。我已经写过如何这样做,但Django的简短版本是使用类似
{{text | Markdown:“safe”}}
(或者,您可以将HTML净化程序(如HTML净化器)应用于Markdown处理器的输出。)这是错误的。
或
在代码块内意味着它是双重转义的。你不想要你认为想要的。所有代码块都需要转义。@Xeoncross你是对的,它是双重转义的。一次是由强制转义
完成的,第二次是由浏览器完成的,因为它是一个代码块。。我我们要做的是使代码块不受force_escape
@burrcat的影响,浏览器不会在代码块内部转义HTML。这是一个常见的误解。还有一些事情是第二次转义代码。
text = u'''
<script>alert("I'm not working 'cause I'll be escaped")</script>
The following would be marked as a code block:
<script>alert("not xss 'cause I'm in <code>")</script>
'''
<p>
<script>alert("I'm not working 'cause I'll be escaped")</script>
The following would be marked as a code block:
</p>
<pre class="codehilite">
<code>
&lt;script&gt;alert(&quot;not xss &#39;cause I&#39;m in &lt;code&gt;&quot;)&lt;/script&gt;
</code>
</pre>
<p>
<script>alert("I'm not working 'cause I'll be escaped")</script>
The following would be marked as a code block:
</p>
<pre class="codehilite">
<code>
<script>alert("not xss 'cause I'm in <code>")</script>
</code>
</pre>