2009-11-10 25 views
2

我有一些html(在這種情況下通過TinyMCE創建)我想添加到頁面。但是,出於安全原因,我不想僅打印用戶輸入的所有內容。Django templatetag用於呈現html的子集

有誰知道一個templatetag(一個過濾器,最好是),將只允許一個安全的HTML子集被渲染?

我意識到降價和其他人這樣做。但是,他們還添加了額外的標記語法,這可能會讓我的用戶感到困惑,因爲他們使用的是不知道降價的富文本編輯器。

回答

6

removetags,但它是一個黑名單的做法,無法刪除標籤時,他們不完全一樣合式標籤Django預計,當然,因爲它不會去除屬性,所以它完全容易受到其他1000種不涉及<script>標籤的腳本注入方式的影響。這是一個陷阱,提供了安全的幻覺,但實際上並沒有真正的安全。

基於正則表達式黑客行爲的HTML sanitisation方法幾乎是不可避免的總失敗。使用真實的HTML解析器爲提交的內容獲取對象模型,然後以已知好的格式進行過濾和重新序列化,通常是最可靠的方法。

如果您的富文本編輯器輸出XHTML很簡單,只需使用minidom或etree來解析文檔,然後遍歷它,刪除所有已知好的元素和屬性,最後轉換回安全的XML。另一方面,如果它吐出HTML,或允許用戶輸入原始HTML,則可能需要使用諸如BeautifulSoup之類的東西。參見this question進行一些討論。

過濾HTML是一個龐大而複雜的話題,這就是爲什麼許多人更喜歡帶限制文本的文本語言。

-1

您可以使用removetags指定的標籤列表被刪除:

{{ data|removetags:"script" }} 
+2

-1這比沒有更糟,因爲它給人一種安全感,沒有真正的好處。圍繞這種黑名單方法有一百萬種方法。 – 2009-11-12 17:22:45

0

使用HTML Purifier,html5lib或構建用於執行HTML清理的其他庫。