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

相关文章
相关标签/搜索