[英]Using safe filter in Django for rich text fields
您關心原始 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.