2014-07-23 24 views
1

我接受用戶在我有一個小論壇上的輸入。這是我做用戶的輸入:Django安全。處理用戶輸入。是html.strip_tags足夠還是應該使用漂白劑?

  • 首先,所謂的「html.strip_tags」從django.utils.html用戶的cleaned_data [輸入。

  • 將其保存到數據庫。 Postgre。

  • 查詢文本並使用正則表達式用br替換\ n並顯示用戶輸入的空格。

  • 然後,我{{text | safe}}顯示文本(如果我不標記它是安全的,它不會在段落之間顯示空格,但是會顯示br標籤)。

  • 最後我在文本上使用了一些jquery插件:Autolinker.js來檢測和「urlize」超鏈接和trunk8來控制它的長度。

那麼,因爲我做{{t​​ext | safe}}我擔心惡意輸入,是不是html.strip_tags夠了?

約strip_tags的寫入文件:

「試圖刪除任何看起來像是從字串的HTML標籤,這是包含在<什麼>絕對沒有擔保提供了有關生成的字符串完全是HTML安全。因此,不要將strip_tag調用的結果標記爲安全,而不要首先轉義它,例如使用escape()。

了Python的死神的文檔:

「漂白劑的主要目的是清理被允許包含一些HTML作爲標記,是被包含在一個更大的頁面的內容用戶輸入」

因爲用戶輸入不允許包含任何html,我的猜測是漂白是不需要的..但​​我是一種noob,所以你的建議將不勝感激。

回答

2

引述docsstriptags

沒有安全保障

注意striptags沒有給出任何關於它的輸出是完全HTML安全,特別是與非有效 HTML輸入任何保證。所以切勿將安全過濾器應用於striptags輸出。如果 您正在尋找更強大的功能,您可以使用漂白劑 Python庫,特別是其清潔方法。

我想這裏的答案是用bleach去掉標籤,就像bleach.clean(text,tags=[])一樣簡單。另外,漂白劑linkefy你也可以照顧網址。

關於您的一般過程,如果該字符串生成一次,並多次查詢......爲什麼不在保存時添加換行符和url?

+0

因爲我讀到將html保存到數據庫是不安全的。但無論如何,如果我使用漂白劑去除標籤,那麼執行'linkify()'並在正則表達式中插入
標籤,當我查詢數據時,我將不得不做'{{text | safe}}',你認爲它會安全嗎? – alejoss

+0

那麼,如果你正確地清理你的html並且你信任清理過程,那麼嵌入豐富文本的唯一方法就是在模板中將其定義爲'safe'。 – haki

0

如果您需要將輸入標記爲「安全」的唯一原因是,它會顯示您在用戶輸入換行符處插入的<br>標記,那麼您最好的方法是使用linebreaks過濾器。從Django documentation

換行符

替換換行符與相應的HTML純文本;一個換行符變爲HTML換行符(<br />),並且一個新行後跟一個空行成爲一個段落符號(</p>)。

例如:

{{ value|linebreaks }} 

如果值是Joel\nis a slug,輸出將是<p>Joel<br />is a slug</p>.

而不是使用正則表達式在你的數據庫,以取代<br>小號換行,見好就收的數據在那裏的隨着用戶輸入它。然後,你可以在模板與

{{ text|striptags|linebreaks }} 

這顯示它會先刪除從用戶的輸入(最)HTML標籤,然後在<br><p>標籤添加換行符。儘管如此,它並沒有將字符串標記爲安全,因此用戶輸入中留下的任何標籤都將被轉義;只有由linebreaks創建的標籤纔會起作用。 (請注意,如果您不想要<p>標籤,則可以使用變體過濾器linebreaksbr)。

相關問題