本节主要是讲解django中的安全特性,讲述django是如何应对网站一般面临的安全性问题

跨站点脚本(XXS)攻击

跨站点脚本攻击是指一个用户把客户端脚本注入到其他用户的浏览器中。通常是通过在数据库中存储恶意的脚本,当这些脚本被检索然后展示给其他用户时实现的攻击的,或者诱使 用户点击攻击者的那些会被用户浏览器运行的脚本。django是如何应付的呢?

django的模板系统可以预防大部分的XXS攻击,然而我们要知道,django预防了那些,还有那些是预防不了的:django模板使用了”转义特殊字符“的方法转义了那些对html有危险的字符,然而,这不是一劳永逸的:

<style class={{ var }}>...</style>

假如var的值是class1 onmouseover=javascript:func()呢?这取决于浏览器如何处理这个不合法的html的了?

因此,当一定要在数据库中存储html的时候,请特别注意保证安全性,特别是这些html会被检索然后呈现给用户的时候!

跨站点请求伪造(CSRF)攻击

csrf攻击是在用户不知情的情况下,该用户的凭据被恶意的用户使用去执行某些动作。

django有内建的措施预防大多数类型的csrf攻击,然而,每一种预防的措施都会有自己的缺陷,比如你的站点有一些不在你控制范围的子站点。

除非万不得已,否则请不要使用csrf_exemp装饰器。

SQL注入攻击

SQL攻击是指恶意的用户可以在一个数据库上执行任意的SQL代码,这可能会带来数据丢失,删除甚至崩溃。

通过django的queryset,产生的SQL将被底层数据库驱动程序正确转义。然而,django也提供开发者写原生的查询和运行自定义的sql,这些都是隐患。

Clickjacking点击劫持

你有没有遇到过这样的情况,打开一个网页,出现一个flash广告框,你点击“关闭”按钮,可结果广告并没有关闭,却变成了全屏,这样的情况在计算机安全领域叫做点击劫持,也就是说你点击鼠标的行为被人给控制了。django的X-Frame-Options 中间件保护一个站点不被渲染成一个框架(html的frame),从而预防了点击劫持。

所以,任何没有必要在第三方站点被封装成框架的站点都应该启用这个中间件。

SSL/HTTPS

能安全总是更好的,尽管有时候并不实际。主要不是安全连接HTTPS,还是会有风险的,无论是认证凭据被截获还是客户端与服务器端的其他信息被转换,还是其他。

如果你想启用HTTPS,这是一些额外的需要配置:(这个配置我自己没有实现过,仅供参考,或许需要的时候我们可以私下讨论一下)

  • 如果需要,设置SECURE_PROXY_SSL_HEADER
  • 设置重定向,以方便HTTP可以转到HTTPS
  • 使用安全的cookie

主机头部验证

有些情况下,django使用Host头部去构造一些url,这些值在XXS攻击下是安全的,当对于CSRF,缓存中毒,毒性链接等时却不一定了。

因为这些看似安全的服务器,还是有伪装头部的嫌疑的。django通过对比ALLOWED_HOST和django.http.HttpRequest.get_host()来验证一个Host头部,记住,仅仅get_host方法是安全的,如果你仅仅使用request.META中的内容来校验host头部,那么你已经置django的安全防护于不顾了

其他的安全问题

尽管django提供了很多的安全防护措施,但恰当的开发自己的应用和使用web服务器,操作系统和其他的组件的有用之处也是很重要的:

  • 确保你的python代码不在web服务器的根目录,这可以确保你的python代码不会被意外执行
  • 小心“用户上传的文件”
  • django不限制请求来验证用户身份,因此,为了避免认证系统遭受暴力攻击,你可能需要开发django插件或者web服务器模块来限制这些请求
  • 如果你的站点接受文件上传,请保证对这些上传有所控制以避免拒绝服务攻击(DOS),比如控制文件的大小
  • 不要泄露你的SECRET_KEY
  • 通过使用防火墙来限制你的缓存和数据库的访问

20:django中的安全问题的更多相关文章

  1. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  2. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  3. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

  4. django中添加用户

    在django中添加用户,直接在auth_user表中添加会有问题,因为这里密码是加密的,可以通过manage.py shell加入 创建User: 1 >>> from djang ...

  5. Django中的Model(字段)

    Model Django中的model是用来操作数据库的,Model是一个ORM框架,我们只需要关心model的操作,而不需要关心到底是哪一种数据库. 一.基本知识: 数据库引擎: Django中自带 ...

  6. Django中的Model(操作表)

    Model 操作表 一.基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = m ...

  7. Django中的CSRF

    CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...

  8. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  9. Django中templates使用的补充

    Django中的模版的使用 1.实例:查询用户信息,在页面显示,并隔行有底色 test1/views文件 def userinfo(request): if request.method=='GET' ...

随机推荐

  1. C#基础-连接Access与SQL Server

    1.连接Access数据库 string strConnection = "Provider=Microsoft.Ace.OleDb.12.0; Data Source=" + S ...

  2. BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4889 https://www.luogu.org/problemnew/show/P3759 加里 ...

  3. AOJ.综合训练.2016-12-1

    友情提示:不要复制粘贴,看完解析先自己尝试写一下,不行再看代码!祝AC愉快 @_@ A. 近似值计算 题意分析 根据公式,先用含有n的代数式表示出来pi,然后计算这个近似值和题目给出来的3.14159 ...

  4. bzoj3524: [Poi2014]Couriers(主席树)

    主席树(可持久化权值线段树)初探... 修改一个点只对树上logn个点有影响,所以新建logn个点就行了,总共新建mlogn个点. 查询一个区间[l,r],相当于将数一个一个加进树,询问第l到第r次操 ...

  5. ywy_c_asm题

    未知出处 题意: 定义一个无穷长的数列,满足以下性质:$1.X_{2n}=-{X_{n}}$ $2.X_{2n}=(-1)^{(n+1)}*X_{n}$ $3.X_{2n-1}=(-1)^{(n+1) ...

  6. Multi-target tracking with Single Moving Camera

    引自:http://www.eecs.umich.edu/vision/mttproject.html Wongun Choi, Caroline Pantofaru, Silvio Savarese ...

  7. selenium - webdriver常用方法

    先定位元素,定位元素后,需要对元素进行后续操作,单击按钮/输入文本,等等. from selenium import webdriver driver = webdriver.Chrome() dri ...

  8. node记录

    集中管理 require('sequelize'); require('node-schedule')

  9. jenkins修改job默认名字

    ${GIT_BRANCH,fullName="false"}-${BUILD_NUMBER}-${GIT_REVISION,length=12}-${deploy_rollback ...

  10. Mysql优化小记1

    在项目开发中,需要写个windows服务从sqlserver复制数据到mysql(5.6.13 Win64(x86_64)),然后对这些数据进行计算分析.每15分钟复制一次,每次复制大概200条数据, ...