XSS攻擊使用戶可以將客戶端腳本注入其他用戶的瀏覽器中。通常,這是通過將惡意腳本存儲在數(shù)據(jù)庫中進行檢索并將其顯示給其他用戶,或者通過使用戶單擊鏈接而導(dǎo)致攻擊者的JavaScript由用戶的瀏覽器執(zhí)行來實現(xiàn)的。但是,只要未在包含在頁面中之前對數(shù)據(jù)進行足夠的清理,XSS攻擊就可能源自任何不受信任的數(shù)據(jù)源,例如cookie或Web服務(wù)。
使用Django模板可以保護您免受大多數(shù)XSS攻擊。但是,重要的是要了解其提供的保護及其限制。
Django模板會轉(zhuǎn)義特定字符 ,這對于HTML來說尤其危險。盡管這可以保護用戶免受大多數(shù)惡意輸入的侵害,但這并不是絕對安全的。例如,它將不會保護以下內(nèi)容:
<style class={{ var }}>...</style>
如果var將設(shè)置為,則可能導(dǎo)致未經(jīng)授權(quán)的JavaScript執(zhí)行,具體取決于瀏覽器如何呈現(xiàn)不完美的HTML。(引用屬性值將解決這種情況。)'class1 onmouseover=javascript:func()'
is_safe與自定義模板標簽,safe模板標簽一起使用mark_safe以及關(guān)閉自動轉(zhuǎn)義功能時,請務(wù)必特別小心。
此外,如果您使用模板系統(tǒng)輸出HTML以外的內(nèi)容,則可能會有完全分開的字符和單詞需要轉(zhuǎn)義。
在數(shù)據(jù)庫中存儲HTML時,也應(yīng)特別小心,尤其是在檢索和顯示HTML時。
CSRF攻擊允許惡意用戶使用另一用戶的憑據(jù)執(zhí)行操作,而無需該用戶的知識或同意。
Django具有針對大多數(shù)CSRF攻擊的內(nèi)置保護,只要您在適當?shù)牡胤絾⒂煤褪褂盟纯?。但是,與任何緩解技術(shù)一樣,存在局限性。例如,可以全局禁用或針對特定視圖禁用CSRF模塊。僅當您知道自己在做什么時,才應(yīng)該這樣做。如果您的站點具有您無法控制的子域,則還有其他限制。
CSRF保護通過檢查每個POST請求中的秘密來起作用。這樣可以確保惡意用戶無法將表單POST“重播”到您的網(wǎng)站,而讓另一個登錄用戶無意間提交該表單。惡意用戶必須知道特定于用戶的秘密(使用cookie)。
與HTTPS一起部署時, CsrfViewMiddleware將檢查HTTP引用標頭是否設(shè)置為同一來源(包括子域和端口)上的URL。因為HTTPS提供了額外的安全性,所以必須通過轉(zhuǎn)發(fā)不安全的連接請求并對支持的瀏覽器使用HSTS來確保連接使用HTTPS可用的連接。
csrf_exempt除非絕對必要,否則請小心用裝飾器標記視圖。
SQL注入是一種攻擊,惡意用戶能夠在數(shù)據(jù)庫上執(zhí)行任意SQL代碼。這可能導(dǎo)致記錄被刪除或數(shù)據(jù)泄漏。
由于Django的查詢集是使用查詢參數(shù)化構(gòu)造的,因此可以防止SQL注入。查詢的SQL代碼是與查詢的參數(shù)分開定義的。由于參數(shù)可能是用戶提供的,因此是不安全的,因此底層數(shù)據(jù)庫驅(qū)動程序會對其進行轉(zhuǎn)義。
Django還使開發(fā)人員可以編寫原始查詢或執(zhí)行自定義sql。這些功能應(yīng)謹慎使用,并且您應(yīng)始終小心謹慎地轉(zhuǎn)義用戶可以控制的任何參數(shù)。此外,使用extra() 和時應(yīng)格外小心RawSQL。
點擊劫持是一種攻擊,其中惡意站點將另一個站點包裝在框架中。這種攻擊可能導(dǎo)致毫無戒心的用戶被誘騙在目標站點上執(zhí)行意外的操作。
Django包含clickjacking保護,其形式為 在支持的瀏覽器中可以防止網(wǎng)站在框架內(nèi)呈現(xiàn)??梢曰诿總€視圖禁用保護或配置發(fā)送的確切報頭值。X-Frame-Options middleware
強烈建議將中間件用于任何不需要第三方站點將其頁面包裝在框架中的站點,或者只需要允許站點的一小部分使用該中間件。
在HTTPS后面部署站點對于安全性而言總是更好的選擇。否則,惡意網(wǎng)絡(luò)用戶可能會嗅探身份驗證憑據(jù)或客戶端與服務(wù)器之間傳輸?shù)娜魏纹渌畔?,并且在某些情況下(活動的網(wǎng)絡(luò)攻擊者)可能會更改沿任一方向發(fā)送的數(shù)據(jù)。
如果您想要HTTPS提供的保護并已在服務(wù)器上啟用了該保護,則可能需要執(zhí)行一些其他步驟:
Host在某些情況下,Django使用客戶端提供的標頭構(gòu)造URL。盡管清除了這些值以防止跨站點腳本攻擊,但偽造的Host值可用于跨站點請求偽造,緩存中毒攻擊和電子郵件中的中毒鏈接。
因為即使看似安全的Web服務(wù)器配置也容易受到偽造的 Host標頭的影響,所以Django會根據(jù)方法Host中的ALLOWED_HOSTS設(shè)置來 驗證標頭 django.http.HttpRequest.get_host()。
此驗證僅通過get_host();如果您的代碼Host直接從request.META您訪問標頭,則會繞過此安全保護。
有關(guān)更多詳細信息,請參見完整ALLOWED_HOSTS文檔。
警告:本文檔的先前版本建議配置Web服務(wù)器,以確保它驗證傳入的HTTP Host標頭。盡管仍然建議這樣做,但是在許多常見的Web服務(wù)器中,似乎可以驗證Host標頭的配置實際上可能沒有這樣做。例如,即使將Apache配置為從具有該ServerName設(shè)置的非默認虛擬主機為Django站點提供服務(wù),HTTP請求仍然有可能匹配該虛擬主機并提供??偽造的Host標頭。因此,Django現(xiàn)在要求您進行ALLOWED_HOSTS顯式設(shè)置,而不是依賴于Web服務(wù)器配置。
此外,如果您的配置需要Django,則Django要求您顯式啟用對X-Forwarded-Host標頭的支持 (通過USE_X_FORWARDED_HOST設(shè)置)。
瀏覽器使用Referer標頭作為向用戶發(fā)送有關(guān)用戶到達那里的信息的方式。通過設(shè)置引薦來源網(wǎng)址策略,您可以幫助保護用戶的隱私,并限制在哪種情況下設(shè)置 Referer標頭。有關(guān)詳細信息,請參見安全中間件參考的引薦來源網(wǎng)址策略部分。
與CSRF的限制類似,它要求部署網(wǎng)站以使不受信任的用戶無法訪問任何子域,這 django.contrib.sessions也有限制。有關(guān)詳細信息,請參見有關(guān)安全性的會話主題指南部分。
注意:考慮從云服務(wù)或CDN提供靜態(tài)文件,以避免其中的某些問題。
盡管Django提供了開箱即用的良好安全保護,但是正確部署應(yīng)用程序并利用Web服務(wù)器,操作系統(tǒng)和其他組件的安全保護仍然很重要。
詳情參考: https://docs.djangoproject.com/en/3.0/
更多建議: