本节主要是讲解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. 洛谷3934:Nephren Ruq Insania——题解

    https://www.luogu.org/problemnew/show/P3934 题面自己读吧(滑稽. 看到这道题就能够想到BZOJ4869:[SHOI2017]相逢是问候我们曾经用过的哲学扩展 ...

  2. nowcoder OI 周赛 最后的晚餐(dinner) 解题报告

    最后的晚餐(dinner) 链接: https://www.nowcoder.com/acm/contest/219/B 来源:牛客网 题目描述 \(\tt{**YZ}\)(已被和谐)的食堂实在是太挤 ...

  3. UVA.725 Division (暴力)

    UVA.725 Division (暴力) 题意分析 找出abcdefghij分别是0-9(不得有重复),使得式子abcde/fghij = n. 如果分别枚举每个数字,就会有10^10,肯定爆炸,由 ...

  4. missing ) after argument list

    ../node_modules/.bin/webpack-dev-server --progress --color --hot --inline -d --host 192.168.1.101 -- ...

  5. MFC单文档多视图程序设计与Splitter拆分窗口

    1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDI ...

  6. lvs学习总结

    看的马哥的视频 NAT1.Director的DIP地址与集群节点必须在同一个网络中[vlan或者subnat] .RIP地址通常是私有地址,仅用于和DIP进行通信 .Director处理进出的所有通信 ...

  7. 在不安装Windows服务的情况下,如何进行调试或测试

    最近由于项目需要,写了几个Windows服务,可是如何对其进行测试呢? 如果通过命令Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ...

  8. 使用awk批量杀进程的命令

    在做系统运维的过程中,有时候会碰到需要杀掉某一类进程的时候,如何批量杀掉这些进程,使用awk命令是很好的选择. ps -ef|grep aaa|grep -v grep|awk '{print &qu ...

  9. Linux系统文件权限体系详解

    准备工作:先简单了解Linux文件权限 在Linux系统中,ls -l 命令可以查看文件的权限,如 [zhaohuizhen@localhost Test]$ ls -l a -rw-rw-r--. ...

  10. js 的function为什么可以添加属性

    (1) function person(){ this.name = 'Tom'; } (2) function person(){} person.name = 'Tom'; (3) functio ...