簡體   English   中英

在 Django 中對富文本字段使用安全過濾器

[英]Using safe filter in Django for rich text fields

我正在將TinyMCE編輯器用於Django表單中的 textarea 文件。

現在,為了向用戶顯示富文本,我被迫在 Django 模板中使用“安全”過濾器,以便可以在瀏覽器上顯示 HTML 富文本。

假設在用戶的瀏覽器上禁用了 JavaScript,TinyMCE 將不會加載並且用戶可以從這樣的 textarea 字段傳遞<script>或其他XSS標簽。 這樣的 HTML 不能安全地顯示給用戶。

我如何處理這種不是來自 TinyMCE 的不安全 HTML 文本?

您關心原始 HTML 是正確的,但不僅僅是針對禁用 Javascript 的瀏覽器。 在考慮服務器的安全性時,您必須忽略在瀏覽器中完成的任何工作,而只看服務器接受什么以及對它發生了什么。 您的服務器接受 HTML 並將其顯示在頁面上。 這是不安全的。

TinyMce 引用 HTML 的事實是一種虛假的安全性:服務器信任它接受的內容,而不信任它。

對此的解決方案是在 HTML 到達時對其進行處理,以刪除危險的結構。 這是一個需要解決的復雜問題。 查看XSS 備忘單,了解可能導致問題的各種輸入。

lxml 有一個清理 HTML 的功能: http : //lxml.de/lxmlhtml.html#cleaning-up-html ,但我從未使用過它,所以我不能保證它的質量。

使用django-bleach 這為您提供了一個bleach模板過濾器,允許您僅過濾掉您想要的標簽:

{% load bleach_tags %}
{{ mymodel.my_html_field|bleach }}

訣竅是配置編輯器以生成與您願意在漂白設置中“通過”相同的標簽。

這是我的漂白設置示例:

# Which HTML tags are allowed
BLEACH_ALLOWED_TAGS = ['p', 'h3', 'h4', 'em', 'strong', 'a', 'ul', 'ol', 'li', 'blockquote']
# Which HTML attributes are allowed
BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'name']
BLEACH_STRIP_TAGS = True

然后,您可以配置 TinyMCE(或您正在使用的任何 WYSIWYG 編輯器),僅使用創建允許標簽的按鈕。

您可以使用模板過濾器“ removetags ”並刪除“腳本”。

請注意, removetags已從 Django 2.0 中刪除。 這是文檔中的棄用通知:

1.8 版后已棄用: removetags不能保證 HTML 安全輸出,出於安全考慮已棄用。 考慮使用bleach代替。

這個沒有很好的答案。 TinyMCE 生成 HTML,django 的自動轉義專門刪除 HTML。

這個問題的傳統解決方案是在用戶輸入端使用一些非 html 標記語言(bbcode、markdown 等),或者將有限數量的 HTML 標簽列入白名單。 TinyMCE/HTML 通常只是適合或多或少受信任用戶的輸入解決方案。

白名單方法很難在沒有任何安全漏洞的情況下實現。 您不想做的一件事就是嘗試只檢測“壞”標簽——您將錯過邊緣情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM