Django 安全策略的 7 條總結!

OneAPM官方技術部落格發表於2015-12-31

Florian Apolloner 發言主題為 Django 安全,其中並未討論針對 SSL 協議的攻擊--因為那不在 Django 涉及範圍內。(如感興趣可參考 https://www.ssllabs.com/ssltest/)。

如發現 Django 的安全漏洞,請參閱 https://djangoproject.com/security,並通過此郵箱與我們聯絡:security@djangoproject.com。請勿將其公開,因為這會給漏洞修補造成極大的困難。 關於安全:參考 OWASP 十大網站安全隱患。以下是幾條安策略總結。

SQL/SMTP/OS 注入

基本規則是不要直接使用使用者輸入的內容。使用者在網站介面輸入的所有內容均應視作危險內容。如果你將使用者輸入的使用者名稱字串直接注入資料庫,像這樣的語句 select * from auth_user where username=%s,那就很容易被注入漏洞。當然如果使用 Django ,它能在內部進行轉義處理,從而降低風險。

最好的方法是實現層級防禦。如果給 URL 中的數值限制一個引數,並通過 ID 而不是字串來選擇使用者,就預防了許多問題。同樣的道理也適用於作業系統互動。用 Django 元件代替你自己的資料儲存或郵箱,因為這些元件的安全性較高,如果沒有 Django 元件,例如 LDAP 認證,那就應該小心了,因為你只得靠自己。總之,不推薦字串插入。

總之千萬不要直接使用使用者輸入的所有內容,如 http 頭資訊、上傳的檔名或內容型別等。

認證和會話管理

基本規則:使用 Django 提供的功能

Django 本身為保證安全做了很多工作,密碼均為加密儲存,且採用多種演算法,隨著多個版本的迭代,新版本又有各種新的演算法。Django 從1.9版本開始有了密碼驗證功能,包括長度檢查、數字字元和通用字的驗證,此外還可以自主增加驗證內容。因此使用1.9版本的要記得使用哦。

Django 允許使用密碼重置連結,其間伺服器不需要儲存任何內容。這個連結傳送給使用者,只能使用一次並且使用一次就可以重置密碼。連結中包含使用者 ID、時間戳、使用者上次登入時間的 HMAC 雜湊值,以及其他幾項內容。如果想啟用這個連結,可以配置 django.core.signing.*

跨站指令碼攻擊(XSS)

Django 的自動轉義功能可阻止大量 XSS,但這僅適用於 HTML,它會用字元代替 < > ' ",屬性都新增引號來進行標識。而 Javascript 則需要不同的轉義 !var mystr="{{ value|escapejs}}"

典型的 XSS 攻擊結果為 data="</script><script>alert('xss')'//"

如果想在在模板中插入json,那麼: var json = JSON.parse('{{ data|escapejs }}'); 或者使用 django -argonauts ,這樣: var json = {{ data|json }}; 如果想進行進一步的防禦,則要啟動 Django 的 XSS 保護,它所採用的 http 標頭能使瀏覽器更嚴格地選擇開啟的內容,阻止內聯 js 和事件處理器。 最關鍵的是要檢查你的庫以及程式碼,因為很多人僅僅是這樣配置 mark_safe(json.dumps()

跨站請求偽造(CSRF)

圖片連結基本採用這樣方式:<img src="mybank.com/t/?amount=1000&to=apollo13">,該功能已預設啟用,可以防止攻擊者將一名使用者連同有害請求一同傳送給網站。Django 通過以下方法防禦該攻擊:在表格中隨機生成一個值,並在你的 cookie 中設定隨機值,如果直接進入表格並輸入該值,便能匹配;如資訊來自不同網站,則無法匹配。

未經驗證的重定向和轉發

/auth/login/?next=http://evil.com 這樣的請求,登入後即進入evil.com,而這顯然存在隱患,因此要配置使用 Django.utils.http.is_safe_url(),其包含的註釋比程式碼還多,表明這是很難使用的程式碼。

檢驗安全列表

執行 manage.py check –deploy,確保每一項配置都正確。該操作會檢查你可能遺漏的安全設定。

改進

如何改進 Django?

  • 限制登入速率
  • 雙重要素認證( TOTPU2F 可作為參考實現方式)。
  • CSRF 提升(#16859)。
  • JSON 模板過濾器,未來將納入 Django 核心功能。
  • SecurityMiddleware 增強(詳見此處)。
  • 實現內容安全策略。
  • 限制 POST/GET 資料長度。

原文連結:http://reinout.vanrees.org/weblog/2015/11/06/django-security.html 本文是 Florian Apolloner 在 2015 Django under the hood 大會的發言總結,系 OneAPM 工程師編譯整理。 本文轉自 OneAPM 官方部落格

相關文章