身份驗(yàn)證失敗

身份驗(yàn)證失效是指由于業(yè)務(wù)應(yīng)用程序?qū)τ脩暨M(jìn)行身份驗(yàn)證的方式而導(dǎo)致的安全漏洞。業(yè)務(wù)系統(tǒng)中最常被濫用的安全相關(guān)組件之一是其身份驗(yàn)證系統(tǒng)。

為了訪問大多數(shù)商業(yè)應(yīng)用程序上的其他信息,用戶必須首先使用其憑據(jù)驗(yàn)證其身份。每個(gè)登錄用戶都會(huì)獲得一個(gè)會(huì)話 ID。這是一種用于跟蹤登錄用戶活動(dòng)的令牌,相當(dāng)于用戶原始登錄憑據(jù)的臨時(shí)替代品。由于會(huì)話信息與登錄用戶相關(guān),因此跟蹤這些會(huì)話 ID 至關(guān)重要,以防止攻擊者冒充會(huì)話的合法所有者。

示例

攻擊者可以通過多種方式通過受損的身份驗(yàn)證系統(tǒng)獲取訪問權(quán)限。

預(yù)防

嚴(yán)格的密碼策略

最好采用嚴(yán)格的密碼策略,密碼長度至少為 8 個(gè)字符,最多為 64 個(gè)字符。不要使用連續(xù)的密碼,例如“1234”或“asdf”、廣受歡迎的“password”,或任何與組織或電子郵件地址相關(guān)的密碼(例如,如果您的企業(yè)名稱是 Stackhawk,則密碼不應(yīng)包含“stackhawk”)。

使用Django-password-strength等軟件包,您可以在 Django 中強(qiáng)制執(zhí)行密碼檢查。或者,您可以在 settings.py 文件中使用 Django 的默認(rèn)設(shè)置,如下所示。

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 11,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]

UserAttributeSimilarityValidator可確保用戶使用的密碼不會(huì)與其在用戶數(shù)據(jù)中提供的現(xiàn)有特征(例如其姓名、電子郵件地址或角色相似。因此,電子郵件地址為“admin@example.com”的管理用戶無法使用“admin”、“admin123”、“exampleAdmin”等密碼。

上述代碼片段中的MinimumLengthValidator表示密碼長度必須至少為 11 個(gè)字符。因此,具有給定電子郵件地址“test@example.com”的用戶將無法使用密碼“Gracey@me”進(jìn)行注冊,因?yàn)樵撁艽a只有 9 個(gè)字符長。

CommonPasswordValidator禁止用戶使用已知已經(jīng)被黑客破解的密碼,例如“abcd12345”。

NumericPasswordValidator限制用戶在密碼中僅使用數(shù)字,例如“0987654321”。

除了維護(hù)強(qiáng)密碼限制之外,用戶如何登錄和退出業(yè)務(wù)應(yīng)用程序也同樣重要。

會(huì)話管理

控制客戶端或服務(wù)器如何保持會(huì)話至關(guān)重要。使用 settings.py 中的 Django 內(nèi)置設(shè)置(如下所示)是管理會(huì)話信息持續(xù)時(shí)間的一種方法。

INSTALLED_APPS = [
...
'django.contrib.sessions',
...
]

MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
SESSION_COOKIE_AGE=1209600 # DEFAULT SESSION AGE OF 2 WEEKS
SESSION_COOKIE_SECURE=True
SESSION_EXPIRE_AT_BROWSER_CLOSE=True

Django 支持設(shè)置參數(shù) SESSION_EXPIRE_AT_ BROWSER_CLOSE 和 SESSION_COOKIE_AGE 來管理會(huì)話。前者在瀏覽器關(guān)閉時(shí),無論會(huì)話 cookie 有多舊,都會(huì)使會(huì)話失效。后者僅在會(huì)話的 cookie 超過期限時(shí)才使會(huì)話失效。

由于 SESSION_EXPIRE_AT_BROWSER_CLOSE 設(shè)置為 True,用戶不僅可以退出業(yè)務(wù)應(yīng)用程序,還可以關(guān)閉瀏覽器,而攻擊者無法訪問瀏覽器中保存的相同會(huì)話數(shù)據(jù),從而防止會(huì)話劫持。

多因素身份驗(yàn)證

在商業(yè)應(yīng)用中,多重身份驗(yàn)證 (MFA) 增加了一層額外的保護(hù)。除了使用用戶名和密碼外,您還可以使用其他身份驗(yàn)證方法。

多因素身份驗(yàn)證有三種類型:

  1. 用戶知道的信息,例如電子郵件地址或密碼
  2. 用戶擁有的信息,例如短信令牌
  3. 使用指紋、虹膜 ID 或面部識(shí)別來驗(yàn)證用戶身份

Django 通過第三方包支持 MFA,而不是內(nèi)置的 Django 包。Django 中兩個(gè)流行的 MFA 包是Django-mfa和Django-multifactor。

在識(shí)別階段,應(yīng)避免多次使用同一類型的多因素組。如果用戶使用電子郵件和密碼加入,則第二種身份驗(yàn)證方法應(yīng)該是令牌或指紋。如果第二個(gè)身份驗(yàn)證元素是指紋,則第三個(gè)身份驗(yàn)證因素必須是令牌。

模糊的回應(yīng)

人們經(jīng)常會(huì)忘記注冊郵箱或密碼。但是,確保向用戶發(fā)送的任何消息都含糊其辭對(duì)于防止惡意用戶濫用響應(yīng)漏洞至關(guān)重要。例如,如果用戶嘗試使用錯(cuò)誤的密碼登錄業(yè)務(wù)應(yīng)用程序,通常會(huì)回復(fù)一條消息:“密碼不正確。請重試。”雖然這對(duì)真正的用戶可能有用,但這是一個(gè)攻擊者可能利用的安全漏洞。

現(xiàn)在攻擊者知道了平臺(tái)上存在電子郵件地址,他或她可以嘗試暴力破解該帳戶。因此,不要在身份驗(yàn)證期間提供具體響應(yīng),而要使用模糊響應(yīng)。例如,如果用戶輸入錯(cuò)誤,則“電子郵件或密碼不正確”將是典型的模糊響應(yīng)。因此,潛在的攻擊者無法確定哪個(gè)是不準(zhǔn)確的。

此外,對(duì)于嘗試恢復(fù)丟失密碼的用戶,您可以嘗試使用“電子郵件已發(fā)送”等不太明顯的消息,而不是使用“電子郵件未注冊”之類的警報(bào)。如果應(yīng)用程序中存在電子郵件地址,您將發(fā)送電子郵件,否則什么也不會(huì)發(fā)生。

身份就是一切

在本文中,我們介紹了攻擊者如何使用會(huì)話數(shù)據(jù)和弱密碼來利用身份驗(yàn)證漏洞。我們還向您展示了如何通過實(shí)施更強(qiáng)大的會(huì)話管理和密碼策略來保護(hù)自己免受這些攻擊者的攻擊。

應(yīng)用程序中身份驗(yàn)證實(shí)施不當(dāng)會(huì)導(dǎo)致攻擊漏洞。隨著世界繼續(xù)依賴互聯(lián)網(wǎng),弱身份驗(yàn)證無處不在,保護(hù)用戶身份比以往任何時(shí)候都更加重要。

文章來源:Django Broken Authentication Guide: Examples and Prevention

上一篇:

Lua CSRF 保護(hù) 指南:示例 以及如何啟用

下一篇:

Kotlin中的安全指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)