-
Django 用户认证 Auth
- 安装
- setting
- 'django.contrib.auth' 包含了验证框架的内核和它的默认模型。
- 'django.contrib.contenttypes' 是 Django content type system ,允许你创建的模型和权限相关联
- Middleware
- SessionMiddleware 通过请求管理 sessions 。
- AuthenticationMiddleware 使用会话将用户和请求关联。
-
Django中的密码管理
- 格式 <algorithm>$<iterations>$<salt>$<hash> 默认情况下,Django 使用带有 SHA256 哈希的 PBKDF2 算法
- Django 通过查阅 PASSWORD_HASHERS 的设置来选择算法
- 增加工作因子,迭代次数
- 密码升级
- 登录时自动升级不安全的加密密码
- 当用户登录时,如果用户的密码使用首选算法以外的算法保存,Django 会自动升级这个算法成为首选算法。这意味着旧的 Django 安装会在用户登录时自动得到更多的安全,并且当它们创建时你可以切换到新的更好的存储算法。
- 无需登录的密码升级
- 有闲心再看吧
- 密码验证
- Django 提供可插拔的密码验证
- 验证由 AUTH_PASSWORD_VALIDATORS 控制。默认的设置是一个空列表,这意味着默认是不验证
- 集成检查
-
Django 缓存框架
- 视图缓存
- 装饰器 django.views.decorators.cache 定义了一个 cache_page 装饰器,它将自动缓存视图的响应:
- 在URLconf 中指定缓存视图
- 访问缓存
- 基本用法
- 使用Vary 标头
- 可变”标头定义了缓存机制在构建其缓存密钥时应考虑哪些请求报头。例如,如果网页的内容取决于用户的语言偏好,则该页面被称为“在语言上有所不同”
-
条件视图处理
- 然后 Django 可以使用函数为视图控制提供 "提前判断" 选
- condition(etag_func=None, last_modified_func=None)
- 函数传递 last_modified_func 应该返回一个标准时间的时间值,指定资源最后修改的时间,如果资源不存在,返回 None 。
- 函数传递到 etag 装饰器应该返回表示资源的 ETag 字符串,如果不存在则返回 None 。
-
加密签名
- 场景
- 生成“恢复我的帐户” URL,以发送给丢失密码的用户。
- 确保存储在隐藏表单字段中的数据未被篡改。
- 生成一次性秘密URL,以允许临时访问受保护的资源,例如用户付费购买的可下载文件
- 保护Secret_key
- 该 settings.py文件会自动生成并获得一个随机SECRET_KEY值。此值是保护签名数据的关键-保持此安全性至关重要
- 使用默认的key
- jango的签名方法存在于django.core.signing模块中。要签名一个值,首先实例化一个Signer实例:
- 使用自己构造的 secret_key
- Signer(key = None,sep =':',salt = None,algorithm = None)
- 返回key用于生成签名和sep分隔值的签名者。sep不能在URL安全的base64字母。该字母包含字母数字字符,连字符和下划线。algorithm必须是所支持的算法 hashlib,默认为'sha256'。
- 使用salt
- 验证时间戳,过期时间
- TimestampSigner 是 Signer 的子类
- TimestampSigner(key = None,sep =':',salt = None,algorithm ='sha256')
- 保护复杂的数据结构
- 如果您希望保护列表,元组或字典,则可以使用签名模块dumps和loads功能来实, 在后台使用JSON序列化。JSON可确保即使您SECRET_KEY被盗,攻击者也无法通过利用pickle格式执行任意命令:
-
发送电子邮件
- 防止头注入过滤掉换行符
- Paginator
-
Django 中的安全性
- 跨站脚本(XSS)保护
- XSS攻击使用户可以将客户端脚本注入其他用户的浏览器中
- 是通过将恶意脚本存储在数据库中来进行检索并将其显示给其他用户,或者通过使用户单击链接来使攻击者的JavaScript由用户的浏览器执行来实现的。
- jango模板会转义特定字符, 这对于HTML来说尤其危险
- 跨站请求伪造(CSRF)保护
- SRF攻击允许恶意用户使用另一用户的凭据执行操作,而无需该用户的知识或同意。
- Django具有针对大多数CSRF攻击的内置保护,只要您在适当的地方启用和使用它即可。但是,与任何缓解技术一样,存在局限性
- HTTPS一起部署时, CsrfViewMiddleware将检查HTTP引用标头是否设置为相同来源(包括子域和端口)上的URL
- csrf_exempt除非绝对必要,否则请务必小心用装饰器标记视图
- SQL 注入
点击劫持保护- 点击劫持是一种攻击,其中恶意站点将另一个站点包装在框架中。这种攻击可能会导致毫无戒心的用户被诱骗在目标站点上执行意外动作。
- X-Frame-Options middleware
SSL- 设置SECURE_PROXY_SSL_HEADER
- 设置SECURE_SSL_REDIRECT为True,以便将通过HTTP的请求重定向到HTTPS。
- SESSION_COOKIE_SECURE和 CSRF_COOKIE_SECURE设置设为True
- 使用HTTP严格传输安全性(HSTS) HSTS是一个HTTP标头,它通知浏览器将来与特定站点的所有连接都应始终使用HTTPS
- HSTS是一个HTTP标头,它通知浏览器将来与特定站点的所有连接都应始终使用HTTPS
主机头验证- Host在某些情况下,Django使用客户端提供的标头构造URL。尽管清除了这些值以防止跨站点脚本攻击,但伪造的Host值可用于跨站点请求伪造,缓存中毒攻击以及电子邮件中的中毒链接。
- 所以Django会根据方法Host中的ALLOWED_HOSTS设置来 验证标头 django.http.HttpRequest.get_host()。
- 此验证仅通过进行get_host();如果您的代码Host直接从request.META您访问标头,则会绕过此安全保护措施。
- 显式启用对X-Forwarded-Host标头的支持(通过USE_X_FORWARDED_HOST设置)。
Referer标头- 设置来源网址
会话安全- 设置cookie 的有效域 path 与CSRF的限制类似,它要求部署网站以使不受信任的用户无法访问任何子域,这django.contrib.sessions也有限制
用户上传的内容- 如果您的站点接受文件上载,则强烈建议您将Web服务器配置中的这些上载限制为合理的大小,以防止拒绝服务(DOS)攻击
其他安全主题- 确保您的Python代码在Web服务器根目录之外。这将确保您的Python代码不会意外用作纯文本(或意外执行)。
- 注意任何用户上传的文件。
- Django不会限制对用户进行身份验证的请求。为了防止对身份验证系统的暴力攻击,您可以考虑部署Django插件或Web服务器模块来限制这些请求。
- 保守SECRET_KEY秘密
- 最好使用防火墙限制缓存系统和数据库的可访问性。
- 查看开放式Web应用程序安全项目(OWASP)的前10个列表,该列表确定了Web应用程序中的一些常见漏洞。尽管Django拥有解决某些问题的工具,但在项目设计中必须考虑其他问题。
- Mozilla讨论了有关Web安全的各种主题。他们的页面还包含适用于任何系统的安全性原则。
-
序列化Django 对象
-
序列化数据
-
将数据直接序列化到类似文件的对象
-
序列化部分字段
-
继承模型
反序列化序列化格式 -
-
Django 设置使用设置