Django 安全策略的 7 条总结!

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

时间: 2024-10-31 02:47:59

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

mysql-如何通过django实现获取某条数据的前一条和后一条数据?

问题描述 如何通过django实现获取某条数据的前一条和后一条数据? 如题,通过django获取某条数据的前一条和后一条数据? 想实现新闻页的"上一条".下一条的功能. 解决方案 http://blog.sina.com.cn/s/blog_67d995f001015jrh.html 解决方案二: 您好,这个是分页呀,我想实现的功能是,查询某一条数据的前后两条数据,通过django实现,不使用sql语句.

django分页后查询丢失

问题描述 django分页后查询丢失 刚学习Django写了一个搜索的视图函数,想对搜索内容进行分页,现在有个问题,搜索内容提交后可以正常分页并显示第一页,选择第二个页时由于GET内容没传过去页面就显示不出来,请问哪个大神有好的解决办法 查询部分 分页部分 {% if results.has_previous %} {# 这里需要将原来的条件传递过来 #} previous {% endif %} Page{{results.number}} of {{results.paginator.num

八条基本措施保障Windows Vista的安全

虽然有这样或那样的缺点,但Vista还是在不少领域占领了一些市场.对于安装了这种操作系统的用户来说,想方设法保障其安全也就成为其义不容辞的责任. 微软开发Vista的一个重要目的就是为了解决这几年来XP所面临的种种安全问题.就我们现在使用的Vista来说,其安全性确实要比XP高出了许多.纵然如此,Vista仍有许多其固有的漏洞.对普通用户而言,采取一些简单的措施来解决这些简单的漏洞问题是很重要的.用户采用本文所谈到的方法可极大地提高Vista的安全性. 一.为系统打上任何必须的补丁 Vista的

djcelery的细节篇

  http://blog.csdn.net/samed/article/details/50598371   随时撸一撸,要点记心间..   1. 下面讲解一下celery.py文件的配置内容,为何要这么配置.   os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings') 设置这个环境变量是为了让 celery 命令能找到 Django 项目.这条语句必须出现在 Celery 实例创建之前.     ap

扶持具有中国特色的信息安全产业的发展是维护网络安全的必要对策

美国着名未来学家阿尔温·托夫勒说:"电脑网络的建立和普及将彻底改变人类生存及生活的模式,控制与掌握网络的人就是未来命运的主宰.谁掌握了信息,控制了网络,谁就拥有整个世界."的确,网络的国际化.社会化.开放化.个人化诱发出无限的商机,电子商务的迅速崛起,使网络成为国际竞争的新战场.然而,由于网络技术本身的缺陷,使得网络社会的脆性大大增加,一旦计算机网络受到攻击不能正常运作时,整个社会就会陷入危机.所以,构筑安全的电子商务信息环境,就成为了网络时代发展到一定阶段而不可逾越的"瓶颈

DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file_path = forms.CharField( required=True, label=u"上传文件", widget=forms.TextInput( attrs={ 'rows': 2, 'class': 'uk-width-1-2', } ), ) upload.html {#

win8本地安全策略问题集

怎么打开"Windows本地安全策略"啊? 答:"搜索"键入"secpol.msc"后回车. 如何防止黑客或恶意程序暴力破解我的系统密码? 答:众所周知,暴力破解Windows密码实质上是通过穷举算法来实现,尤其是密码过于简单的系统,暴力破解的方法还是比较实用的.有一点需要 我们注意,这个问题的关键在于Windows是否允许远程客户端或恶意程序来进行用户名和密码的穷举,如果不允许,恶意程序企图通过枚举获得管理员权限这 条路就是个死胡同.那么,如何

django接入新浪微博OAuth的方法

  本文实例讲述了django接入新浪微博OAuth的方法.分享给大家供大家参考.具体分析如下: 最近将网站和新浪微博进行了整合,思路很简单,就是将页面内容和新浪微博联系起来,一个独立内容的页面对于一条微博,自然评论系统只需要使用微博的评论即可. 然后,用户需要发表评论的话,肯定要接入oauth,不可能让用户登录你的网站来发评论吧?没有谁会将自己的账号和密码告诉你的. 查看了新浪微博的授权机制,然后下载了python版的sdk,就可以在django上接入oauth了. 对于oauth很陌生的同学

win8本地安全策略常见问题解答

下面是关于win8本地安全策略的常见问题解答,大家可以参考一下. 怎么打开"Windows本地安全策略"啊?答:"搜索"键入"secpol.msc"后回车. 如何防止黑客或恶意程序暴力破解我的系统密码?答:众所周知,暴力破解Windows密码实质上是通过穷举算法来实现,尤其是密码过于简单的系统,暴力破解的方法还是比较实用的.有一点需要我们注意,这个问题的关键在于Windows是否允许远程客户端或恶意程序来进行用户名和密码的穷举,如果不允许,恶意程