Django HTML:清理一组标记,但允许<;中的所有标记;代码>;阻碍

Django HTML:清理一组标记,但允许<;中的所有标记;代码>;阻碍,django,markdown,html-sanitizing,Django,Markdown,Html Sanitizing,我正在使用Django+Markdown来处理用户输入。降价过滤器生成的文本需要是“安全的”,并且不受django的自动转义机制的保护,所以我必须自己转义用户输入。我现在就是这样做的: {{ text|force_escape|markdown:"codehilite" }} 但是,如果代码>文本< /代码>包含了一个被标记为“代码> >代码> 的东西,它也会逃脱,输出将是相当丑陋的(例如,在将它传递给标记之前不要逃避输入。正如您所发现的,在某些情况下,这会打断用户的输入。并且,它不能确保安全

我正在使用Django+Markdown来处理用户输入。降价过滤器生成的文本需要是“安全的”,并且不受django的自动转义机制的保护,所以我必须自己转义用户输入。我现在就是这样做的:

{{ 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>
    &lt;script&gt;alert("I'm not working 'cause I'll be escaped")&lt;/script&gt;
    The following would be marked as a code block:
</p>
<pre class="codehilite">
    <code>
        &amp;lt;script&amp;gt;alert(&amp;quot;not xss &amp;#39;cause I&amp;#39;m in &amp;lt;code&amp;gt;&amp;quot;)&amp;lt;/script&amp;gt;
    </code>
</pre>
<p>
    &lt;script&gt;alert("I'm not working 'cause I'll be escaped")&lt;/script&gt;
    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>