Django 安全策略的 7 条总结!
2015-12-31 10:02
288 查看
Florian Apolloner 发言主题为 Django 安全,其中并未讨论针对 SSL 协议的攻击--因为那不在 Django 涉及范围内。(如感兴趣可参考 https://www.ssllabs.com/ssltest/)。
如发现 Django 的安全漏洞,请参阅 https://djangoproject.com/security,并通过此邮箱与我们联系:security@djangoproject.com。请勿将其公开,因为这会给漏洞修补造成极大的困难。
关于安全:参考 OWASP 十大网站安全隐患。以下是几条安策略总结。
最好的方法是实现层级防御。如果给 URL 中的数值限制一个参数,并通过 ID 而不是字符串来选择用户,就预防了许多问题。同样的道理也适用于操作系统交互。用 Django 组件代替你自己的数据存储或邮箱,因为这些组件的安全性较高,如果没有 Django 组件,例如 LDAP 认证,那就应该小心了,因为你只得靠自己。总之,不推荐字符串插入。
总之千万不要直接使用用户输入的所有内容,如 http 头信息、上传的文件名或内容类型等。
Django 本身为保证安全做了很多工作,密码均为加密保存,且采用多种算法,随着多个版本的迭代,新版本又有各种新的算法。Django 从1.9版本开始有了密码验证功能,包括长度检查、数字字符和通用字的验证,此外还可以自主增加验证内容。因此使用1.9版本的要记得使用哦。
Django 允许使用密码重置链接,其间服务器不需要储存任何内容。这个链接发送给用户,只能使用一次并且使用一次就可以重置密码。链接中包含用户 ID、时间戳、用户上次登录时间的 HMAC 哈希值,以及其他几项内容。如果想启用这个链接,可以配置
典型的 XSS 攻击结果为
如果想在在模板中插入json,那么:
或者使用 django -argonauts ,这样:
如果想进行进一步的防御,则要启动 Django 的 XSS 保护,它所采用的 http 标头能使浏览器更严格地选择打开的内容,阻止内联 js 和事件处理器。
最关键的是要检查你的库以及代码,因为很多人仅仅是这样配置
限制登录速率
双重要素认证( TOTP 和 U2F 可作为参考实现方式)。
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 的安全漏洞,请参阅 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?限制登录速率
双重要素认证( TOTP 和 U2F 可作为参考实现方式)。
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 官方博客
相关文章推荐
- 谷歌 Project Zero 团队宣布新政策,漏洞披露前将有完整的 90 天缓冲期
- 春节长假安全手册
- 地震避险自救常识
- 路由器安全有关的目录
- 打造个性_安全的电脑系统图文教程2第1/2页
- 路由器内的安全认证
- 加强php的安全之一
- http www安全必备知识
- SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文
- C语言安全编码之数值中的sizeof操作符
- PHP安全上传图片的方法
- C#实现线程安全的简易日志记录方法
- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- django使用ajax post数据出现403错误如何解决
- php 编写安全的代码时容易犯的错误小结
- JSP应用的安全问题
- asp.net安全、实用、简单的大容量存储过程分页第1/2页