2011-08-12 99 views
2

我在應用中使用Markdown來顯示用戶簡歷。我希望用戶能夠略微地設置傳記的格式,所以我讓他們使用TinyMCE編輯器。Django XSS安全降價

然後,在Django的模板顯示像這樣

{% load markup %} 

<div id="biography"> 
    {{ biography|markdown }} 
</div> 

問題是,如果在傳一個標籤,它沒有被轉義爲Django的做其他任何地方。這是來自傳記測試的源輸出:

<p><strong>asdfsdafsadf</strong></p> 
<p><strong>sd<em>fdfdsfsd</em></strong><em>sdfsdfsdfdsf</em>sdfsdfsdf</p> 
<p><strong>sdafasdfasdf</strong></p> 

<script>document.location='http://test.com'</script> 

如何設置Markdown來轉義這些惡意腳本?

回答

3

根據django.contrib.markup.templatetags.markup.markdown的文檔字符串:

要啓用安全模式,它去掉原始HTML並且僅返回由實際降價語法生成的HTML ,通過‘安全’作爲第一 延伸在列表中。

這應該工作:

{{ biography|markdown:"safe" }} 
+0

是否有一種簡單的方法來處理「傳記」包含您想要的HTML代碼示例的情況顯示? –

-1

降價在安全模式下將刪除所有的HTML代碼,這意味着在傳記用戶不能輸入HTML片段。在某些情況下,這是不可取的。我建議你在markdown之前使用force_escape,所以任何饋送到markdown的東西都是安全的。

例如,如果你的自傳<html>I'm really a HTML fan!</html>,使用

{{ biography|markdown:"safe"}} 

會產生HTML REMOVED ..相反,如果使用

{{ biography|force_escape|markdown }} 

輸出會是這樣的

<p>&lt;html&gt;I'm really a HTML fan!&lt;/html&gt</p> 
+0

這看起來很自然,但我認爲它實際上並不安全。例如:''[clickme](javascript:alert%28%22xss%22%29)'「。有關更多詳細信息,請參閱我的解釋[別處](http://security.stackexchange.com/a/14674/971)。 –

+0

@ D.W。 'markdown(html,safe_mode ='escape')'現在對我來說似乎很完美。有問題嗎? – blurrcat

+0

是的。你推薦'force_escape | markdown',問題在於它不安全:它不會用安全標誌調用Markdown,因此對於我描述的那種攻擊是不安全的。請參閱我給出的詳細解釋鏈接。試試''markdown(force_escape(「[clickme](javascript:alert%28%22xss%22%29)」))'「看看我的意思;結果有Javascript。 –