Django 安全策略的 7 條總結!

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

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

SQL/SMTP/OS 注入

基本規則是不要直接使用用戶輸入的內容。用戶在網站界面輸入的全部內容均應視做危險內容。若是你將用戶輸入的用戶名字符串直接注入數據庫,像這樣的語句 select * from auth_user where username=%s,那就很容易被注入漏洞。固然若是使用 Django ,它能在內部進行轉義處理,從而下降風險。git

最好的方法是實現層級防護。若是給 URL 中的數值限制一個參數,並經過 ID 而不是字符串來選擇用戶,就預防了許多問題。一樣的道理也適用於操做系統交互。用 Django 組件代替你本身的數據存儲或郵箱,由於這些組件的安全性較高,若是沒有 Django 組件,例如 LDAP 認證,那就應該當心了,由於你只得靠本身。總之,不推薦字符串插入。github

總之千萬不要直接使用用戶輸入的全部內容,如 http 頭信息、上傳的文件名或內容類型等。web

認證和會話管理

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

Django 自己爲保證安全作了不少工做,密碼均爲加密保存,且採用多種算法,隨着多個版本的迭代,新版本又有各類新的算法。Django 從1.9版本開始有了密碼驗證功能,包括長度檢查、數字字符和通用字的驗證,此外還能夠自主增長驗證內容。所以使用1.9版本的要記得使用哦。數據庫

Django 容許使用密碼重置連接,其間服務器不須要儲存任何內容。這個連接發送給用戶,只能使用一次而且使用一次就能夠重置密碼。連接中包含用戶 ID、時間戳、用戶上次登陸時間的 HMAC 哈希值,以及其餘幾項內容。若是想啓用這個連接,能夠配置 django.core.signing.*django

跨站腳本攻擊(XSS)

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

典型的 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 官方博客

相關文章
相關標籤/搜索