Florian Apolloner 发言主题为 Django 安全,其中并未讨论针对 SSL 协议的攻击--因为那不在 Django 涉及范围内。(如感兴趣可参考 https://www.ssllabs.com/ssltest/)。

如发现 Django 的安全漏洞,请参阅 https://djangoproject.com/security,并通过此邮箱与我们联系:security@djangoproject.com。请勿将其公开,因为这会给漏洞修补造成极大的困难。

关于安全:参考 OWASP 十大网站安全隐患。以下是几条安策略总结。

SQL/SMTP/OS 注入

基本规则是不要直接使用用户输入的内容。用户在网站界面输入的所有内容均应视作危险内容。如果你将用户输入的用户名字符串直接注入数据库,像这样的语句 select * from auth_user where username=%s,那就很容易被注入漏洞。当然如果使用 Django ,它能在内部进行转义处理,从而降低风险。

最好的方法是实现层级防御。如果给 URL 中的数值限制一个参数,并通过 ID 而不是字符串来选择用户,就预防了许多问题。同样的道理也适用于操作系统交互。用 Django 组件代替你自己的数据存储或邮箱,因为这些组件的安全性较高,如果没有 Django 组件,例如 LDAP 认证,那就应该小心了,因为你只得靠自己。总之,不推荐字符串插入。

总之千万不要直接使用用户输入的所有内容,如 http 头信息、上传的文件名或内容类型等。

认证和会话管理

基本规则:使用 Django 提供的功能

Django 本身为保证安全做了很多工作,密码均为加密保存,且采用多种算法,随着多个版本的迭代,新版本又有各种新的算法。Django 从1.9版本开始有了密码验证功能,包括长度检查、数字字符和通用字的验证,此外还可以自主增加验证内容。因此使用1.9版本的要记得使用哦。

Django 允许使用密码重置链接,其间服务器不需要储存任何内容。这个链接发送给用户,只能使用一次并且使用一次就可以重置密码。链接中包含用户 ID、时间戳、用户上次登录时间的 HMAC 哈希值,以及其他几项内容。如果想启用这个链接,可以配置 django.core.signing.*

跨站脚本攻击(XSS)

Django 的自动转义功能可阻止大量 XSS,但这仅适用于 HTML,它会用字符代替 < > ' ",属性都添加引号来进行标识。而 Javascript 则需要不同的转义 !var mystr="{{ value|escapejs}}"

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

Django 安全策略的 7 条总结!的更多相关文章

  1. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  2. 玩儿了一下django User authentication

    五一在家,VPN不能链接了,而项目在本地run的过程中,又需要链接公司的SSO server才能login.下雨,不想去公司,又不得不在家做task,只能想办法避开SSO login,以前知道djan ...

  3. <django中render_to_response的可选参数和使用方法>

    在django官方文档中有比较详细的介绍,在此我按照自己的理解适当的阐述一下: return render_to_response(①'my_template.html', ②my_data_dict ...

  4. python学习笔记--Django入门二 Django 的模板系统

    为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开.我们可以使用Django的 模板系统 (Template System)来实现这种模式. 几个简单的模板标签(tag):   ...

  5. Django模型-数据库操作

    前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...

  6. 第四章:Django 的模板系统(转)

    在之前的章节中,你可能觉得例子中视图返回文本有点不妥.即是, HTML 是直接写在 Python 代码中的.     这种做法会导致这些问题:     要做任何设计上的更改就必须改写 Python 代 ...

  7. 关于Django模板引擎的研究

    原创博文,转载请注明出处. 以前曾遇到过错误Reverse for ‘*’ with arguments '()' and keyword arguments' not found.1其原因是没有给视 ...

  8. Django模板引擎的研究

    Django模板引擎的研究 原创博文,转载请注明出处. 以前曾遇到过错误Reverse for ‘*’ with arguments '()' and keyword arguments' not f ...

  9. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

随机推荐

  1. android应用版本更新功能---完整版

    源码下载地址:csdn下载地址:http://download.csdn.net/download/csdn576038874/9526085 博客园下载地址:http://files.cnblogs ...

  2. 自定义标签 tld

    初学者可能在不借助IDE工具的情况下 编写自定义标签库 tld  程序可能遇到找不到class 的错误,下面讲解一下如何解决该问题 步骤一:新建一个自定义标签类 HelloWorldTag,该类放到s ...

  3. Unity3D 之NGUI各种脚本及应用

    这里来介绍一下NGUI的各种脚本的作用,以便以后需要某种效果的时候,去添加相应的脚本去实现效果 UIButton --> 按钮脚本 UIPanel   --> 面板脚本 UIToggle  ...

  4. 【转】【SQLServer】SQL Server 2008“阻止保存要求重新创建表的更改”

    不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑. ...

  5. effective c++(03)之const使用方法

    char greeting[] = "hello"; char* p = greeting; //non-const pointer,non-const data const ch ...

  6. 产品原型设计5:移动App原型设计神器 - POP(Prototyping on Paper)

    一般来说,苦逼的互联网产品经理们都知道 Axure 这个原型设计工具,一方面是因为它提供了足够简单的拖拽操作,易上手,且有很多模板方便复用:另一方是因为它可直接输出html,直接在浏览器里给团队成员和 ...

  7. 如何理解systemstate

    什么是systemstate一个systemstate是由在实例中调用生成systemstats时由每一个进程的进程状态组成.而每一个进程状态是由每一个进程所持有的当前对象所对应的详细对象状态信息组成 ...

  8. 10.13_extjs,combox,效率为什么这么低

    (1)今天很累!经过三天的奋斗,终于完成了完全最优界面的快捷选址功能.今天是最后一天,最紧张,也最累. 为何我的效率不高呢?!我的时间都花费到哪儿呢?①阅读代码理解过去的逻辑:②关键技术上的再复习再巩 ...

  9. IniParse解析类

    说明 iniParse这个类是一个解析ini文件的类,他的功能和Windows下GetPrivateProfileString的功能一样,可以很方便的保存读取配置. 当然他不是只有GetPrivate ...

  10. MVC的发展

    ASP.NET下的MVC从原始的1.0走到2.0,再到3.0,现在走到4.0,也许明年5.0就问世了,先不管那些,那说说这些MVC在ASP.NET是如何变化发展的.对于.net编程人员来说可能会很熟悉 ...