Shopify API 初学者教程:定价、API操作指南
Django Broken 认证指南: 示例和预防
截至 2021 年,身份验证漏洞在开放 Web 应用程序安全项目 (OWASP) 十大漏洞榜单中排名第七。身份验证系统漏洞可让攻击者访问用户帐户,并可能利用管理员帐户危害整个系统。
在本文中,我们将描述失效的身份验证。我们还将提供一些示例,并介绍一些使 Django 应用程序更安全的策略。您应该能够将所学知识应用到您的 Django 应用程序中。
身份验证失败
身份验证失效是指由于业务应用程序对用户进行身份验证的方式而导致的安全漏洞。业务系统中最常被滥用的安全相关组件之一是其身份验证系统。
为了访问大多数商业应用程序上的其他信息,用户必须首先使用其凭据验证其身份。每个登录用户都会获得一个会话 ID。这是一种用于跟踪登录用户活动的令牌,相当于用户原始登录凭据的临时替代品。由于会话信息与登录用户相关,因此跟踪这些会话 ID 至关重要,以防止攻击者冒充会话的合法所有者。
示例
攻击者可以通过多种方式通过受损的身份验证系统获取访问权限。
- 利用会话管理问题,例如登录成功后未能轮换会话 ID,或者注销时未能正确使会话 ID 失效
- 尝试使用已知密码暴力破解合法用户名或电子邮件
- 允许人们使用弱密码或流行密码(例如“123456”)注册网站
- 使用弱凭证恢复流程(例如基于知识的答案)
- 使用弱哈希密码或纯文本密码
预防
严格的密码策略
最好采用严格的密码策略,密码长度至少为 8 个字符,最多为 64 个字符。不要使用连续的密码,例如“1234”或“asdf”、广受欢迎的“password”,或任何与组织或电子邮件地址相关的密码(例如,如果您的企业名称是 Stackhawk,则密码不应包含“stackhawk”)。
使用Django-password-strength等软件包,您可以在 Django 中强制执行密码检查。或者,您可以在 settings.py 文件中使用 Django 的默认设置,如下所示。
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可确保用户使用的密码不会与其在用户数据中提供的现有特征(例如其姓名、电子邮件地址或角色)相似。因此,电子邮件地址为“admin@example.com”的管理用户无法使用“admin”、“admin123”、“exampleAdmin”等密码。
上述代码片段中的MinimumLengthValidator表示密码长度必须至少为 11 个字符。因此,具有给定电子邮件地址“test@example.com”的用户将无法使用密码“Gracey@me”进行注册,因为该密码只有 9 个字符长。
CommonPasswordValidator禁止用户使用已知已经被黑客破解的密码,例如“abcd12345”。
NumericPasswordValidator限制用户在密码中仅使用数字,例如“0987654321”。
除了维护强密码限制之外,用户如何登录和退出业务应用程序也同样重要。
会话管理
控制客户端或服务器如何保持会话至关重要。使用 settings.py 中的 Django 内置设置(如下所示)是管理会话信息持续时间的一种方法。
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 支持设置参数 SESSION_EXPIRE_AT_ BROWSER_CLOSE 和 SESSION_COOKIE_AGE 来管理会话。前者在浏览器关闭时,无论会话 cookie 有多旧,都会使会话失效。后者仅在会话的 cookie 超过期限时才使会话失效。
由于 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True,用户不仅可以退出业务应用程序,还可以关闭浏览器,而攻击者无法访问浏览器中保存的相同会话数据,从而防止会话劫持。
多因素身份验证
在商业应用中,多重身份验证 (MFA) 增加了一层额外的保护。除了使用用户名和密码外,您还可以使用其他身份验证方法。
多因素身份验证有三种类型:
- 用户知道的信息,例如电子邮件地址或密码
- 用户拥有的信息,例如短信令牌
- 使用指纹、虹膜 ID 或面部识别来验证用户身份
Django 通过第三方包支持 MFA,而不是内置的 Django 包。Django 中两个流行的 MFA 包是Django-mfa和Django-multifactor。
在识别阶段,应避免多次使用同一类型的多因素组。如果用户使用电子邮件和密码加入,则第二种身份验证方法应该是令牌或指纹。如果第二个身份验证元素是指纹,则第三个身份验证因素必须是令牌。
模糊的回应
人们经常会忘记注册邮箱或密码。但是,确保向用户发送的任何消息都含糊其辞对于防止恶意用户滥用响应漏洞至关重要。例如,如果用户尝试使用错误的密码登录业务应用程序,通常会回复一条消息:“密码不正确。请重试。”虽然这对真正的用户可能有用,但这是一个攻击者可能利用的安全漏洞。
现在攻击者知道了平台上存在电子邮件地址,他或她可以尝试暴力破解该帐户。因此,不要在身份验证期间提供具体响应,而要使用模糊响应。例如,如果用户输入错误,则“电子邮件或密码不正确”将是典型的模糊响应。因此,潜在的攻击者无法确定哪个是不准确的。
此外,对于尝试恢复丢失密码的用户,您可以尝试使用“电子邮件已发送”等不太明显的消息,而不是使用“电子邮件未注册”之类的警报。如果应用程序中存在电子邮件地址,您将发送电子邮件,否则什么也不会发生。
身份就是一切
在本文中,我们介绍了攻击者如何使用会话数据和弱密码来利用身份验证漏洞。我们还向您展示了如何通过实施更强大的会话管理和密码策略来保护自己免受这些攻击者的攻击。
应用程序中身份验证实施不当会导致攻击漏洞。随着世界继续依赖互联网,弱身份验证无处不在,保护用户身份比以往任何时候都更加重要。
文章来源:Django Broken Authentication Guide: Examples and Prevention