Host在某些情況下,Django使用客戶端提供的標頭構造URL。儘管清除了這些值以防止跨站點腳本攻擊,但偽造的Host值可用於跨站點請求偽造,緩存中毒攻擊以及電子郵件中的中毒鏈接。
因為即使看似安全的Web服務器配置也容易受到偽造的 Host標頭的影響,所以Django會根據方法Host中的ALLOWED_HOSTS設置來 驗證標頭 django.http.HttpRequest.get_host()。
此驗證僅通過get_host();如果您的代碼Host直接從request.META您訪問標頭,則會繞過此安全保護。
與CSRF的限制類似,它要求部署網站以使不受信任的用戶無法訪問任何子域,這 django.contrib.sessions也有限制。
考慮從雲服務或CDN提供靜態文件,以避免其中的某些問題。
如果您的站點接受文件上載,則強烈建議您將Web服務器配置中的這些上載限制為合理的大小,以防止拒絕服務(DOS)攻擊。在Apache中,可以使用LimitRequestBody指令輕鬆設置此值。
如果您要提供自己的靜態文件,請確保mod_php禁用諸如Apache的處理程式,該處理程式 將靜態文件作為代碼執行。您不希望用戶能夠通過上載和請求特製文件來執行任意代碼。
當以不遵循安全最佳實踐的方式提供媒體時,Django的媒體上傳處理會帶來一些漏洞。具體來說,如果HTML文件包含有效的PNG標頭和惡意HTML,則該HTML文件可以作為圖像上傳。該文件將通過Django用於ImageField圖像處理的庫的驗證(枕頭)。隨後將該文件顯示給用戶時,根據您的Web服務器的類型和配置,它可能會顯示為HTML。
在框架級別沒有可以安全驗證所有用戶上傳文件內容的防彈技術解決方案,但是,您可以採取一些其他步驟來減輕這些攻擊:
通過始終為來自不同的頂級域或第二級域的用戶上傳的內容提供服務,可以防止一類攻擊。這樣可以防止任何由同源策略保護(例如跨站點腳本)阻止的漏洞利用。例如,如果您的網站在上運行example.com,您可能希望通過來提供上載的內容(MEDIA_URL設置)usercontent-example.com。這是不是足以從像一個子域提供內容usercontent.example.com。
除此之外,應用程式可能會選擇為用戶上傳的文件定義允許的文件擴展名白名單,並將Web服務器配置為僅提供此類文件。
儘管Django提供了開箱即用的良好安全保護,但是正確部署應用程式並利用Web服務器,操作系統和其他組件的安全保護仍然很重要。
確保您的Python代碼在Web服務器根目錄之外。這將確保您的Python代碼不會意外地用作純文本(或意外地執行)。
註意任何用戶上傳的文件。
Django不會限制對用戶進行身份驗證的請求。為了防止對身份驗證系統的暴力攻擊,您可以考慮部署Django插件或Web服務器模塊來限制這些請求。
保守SECRET_KEY秘密
最好使用防火牆限制緩存系統和數據庫的可訪問性。
查看開放式Web應用程式安全項目(OWASP)的前10個列表,該列表確定了Web應用程式中的一些常見漏洞。儘管Django擁有解決某些問題的工具,但在項目設計中必須考慮其他問題。