Python编程:Django之安全验证

简介: Python编程:Django之安全验证

一、装饰器

鉴权装饰器函数

def auth(func):
        # 用户验证的装饰器
        def inner(request, *args, **kwargs):
            u = request.COOKIES.get("username")
            if not u:
                return redirect("/a/login")
            return func(request, *args, **kwargs)
        return inner

1、FBV


 

@auth
    def admin(request):
        u = request.COOKIES.get("username")
        return render(request, "admin.html", {"user": u})

2、CBV


 

from django.views import View
    from django.utils.decorators import method_decorator
    #  方式三,类上加认证装饰器
    @method_decorator(auth, name="dispatch")  
    class Order(View):
        # 方式二,入口处加认证装饰器
        # @method_decorator(auth)
        def dispatch(self, request, *args, **kwargs):
        return  super(Order, self).dispatch(request, *args, **kwargs)
        # 方式一,方法上加认证装饰器
        # @method_decorator(auth)  
        def get(self, request):
        u = request.COOKIES.get("username")
        return render(request, "admin.html", {"user": u})
        def post(self, request):
        u = request.COOKIES.get("username")
        return render(request, "admin.html", {"user": u})

二、cookie

客户端浏览器上的一个文件

基于cookie做用户验证


1、Django后台

(1)普通cookie


 

# 获取: 
    request.COOKIES.get("pre_count", 10)
    # 设置: 
    rep = HttpResponse(...) 或 rep = render(request, ...)
          rep.set_cookie(key,value,...)
    """
    参数:
    key,              键
    value='',         值
    max_age=None,     超时时间长度
    expires=None,     到期时间点
    path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
    domain=None,      Cookie生效的域名
    secure=False,     https传输
    httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    """

(2)加密cookie


 

# 设置: 
    ret.set_signed_cookie(key="username", value=username, expires=t, salt="ppyy")
    # 获取:
    u = request.get_signed_cookie("username", salt="ppyy")
    # 备注:设置和获取的salt参数要一致,相当于钥匙

2、前端获取

(1)浏览器console查看 :


 

document.cookie

(2)通过jQuery获取


 

//jquery插件:http://plugins.jquery.com/cookie/
    //获取: 
    var v = $.cookie("pre_count");
    //设置: 
    $.cookie("pre_count", v);

三、session

基于cookie做用户验证时,敏感信息不适合放在cookie中


1、session原理


cookie 是保存在用户浏览器端的键值对
session 是保存在服务端的键值对

2、流程:

(1)设置session


 

生成随机字符串
    写到用户浏览器cookie
    保存到session中
    在随机字符串字典中设置相关内容
    后台需要建立初始化数据库,系统自动建立表 django_session

(2)获取session


获取用户的随机字符串
    根据随机字符串获取对应值

3、cookie 和 session 对比


session依赖于cookie

4、session配置(缺少cache)


5、示例: 实现两周自动登录


request.session.set_expiry(60*10)

6、操作:


# 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    request.session.clear()
    # 用户session的随机字符串
    request.session.session_key
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    # 检查 用户session的随机字符串 在数据库中是否
    request.session.exists("session_key")
    # 删除当前用户的所有Session数据
    request.session.delete("session_key")
    request.session.set_expiry(value)
    """
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
    """

7、配置 settings.py

(1)种类:


数据库(默认)
缓存
文件
缓存+数据库
加密cookie

(2)默认配置


 

# 引擎(默认)
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   
    # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_NAME = "sessionid"
    # Session的cookie保存的路径(默认)
    SESSION_COOKIE_PATH = "/"
    # Session的cookie保存的域名(默认)
    SESSION_COOKIE_DOMAIN = None
    # 是否Https传输cookie(默认)
    SESSION_COOKIE_SECURE = False
    # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_HTTPONLY = True
    # Session的cookie失效日期(2周)(默认)
    SESSION_COOKIE_AGE = 1209600
    # 是否关闭浏览器使得Session过期(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    # 是否每次请求都保存Session,默认修改之后才保存(默认)
    SESSION_SAVE_EVERY_REQUEST = False

四、Form验证

1、功能:


生成HTML标签
验证用户数据(显示错误信息)
HTML Form提交保留上次提交数据
初始化页面显示内容

2、自定义:


字段(校验数据)
插件(生成html)

3、初始化:


 

fm = FM(initial=dct)

五、缓存

1、5种配置:


开发调试
内存
文件
数据库
Memcache缓存(python-memcached模块)
Memcache缓存(pylibmc模块)

2、保存至文件示例


 

# 此缓存将内容保存至文件
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/tmp/django_cache',
        }
    }

3、3种应用:

(1)全局


 

MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 其他中间件...
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
    CACHE_MIDDLEWARE_ALIAS = ""
    CACHE_MIDDLEWARE_SECONDS = ""
    CACHE_MIDDLEWARE_KEY_PREFIX = ""

(2)视图函数


 

from django.views.decorators.cache import cache_page
    @cache_page(10)
    def my_view(request):
        pass
    或者:
    urlpatterns = [
        url(r'^foo/([0-9]{1,2})/$', cache_page(10)(my_view)),
    ]

(3)模板局部


 

{% load cache %}
    {% cache 5000 缓存key %}
        缓存内容
    {% endcache %}

六、中间件(管道)

1、基类:


 

from django.utils.deprecation import MiddlewareMixin

2、四个方法:


 

process_request(self,request)
    process_view(self, request, callback, callback_args, callback_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)

3、自定义:


 

class RequestExeute(object):
        def process_request(self,request):
            pass
        def process_view(self, request, callback, callback_args, callback_kwargs):
            i =1
            pass
        def process_exception(self, request, exception):
            pass
        def process_response(self, request, response):
            return response

4、注册:MIDDLEWARE


七、信号

1、内置信号

(1)Model signals


pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发

(2)Management signals


 

pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发

(3)Request/response signals


request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发

(4)Test signals


 

setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发

(5)Database Wrappers


 

connection_created          # 创建数据库连接时,自动触发

2、使用:


from django.db.models.signals import pre_save, post_save
    def callback(sender, **kwargs):
        pass
    pre_save.connect(callback)
    # xxoo指上述导入的内容

3、自定义信号

(1)定义信号


 

import django.dispatch
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

(2)注册信号


 

def callback(sender, **kwargs):
        print("callback")
        print(sender,kwargs)
    # 信号中注册函数
    pizza_done.connect(callback)

(3)触发信号


from 路径 import pizza_done
    pizza_done.send(sender='seven',toppings=123, size=456)

八、CSRF

(Cross-site request forgery)跨站请求伪造


1、CSRF原理

post的时候进行验证,无csrf时存在的隐患


2、使用token

(1)form提交(csrf)


 

{% csrf_token %}

(2)ajax提交(csrf)


 

$.ajaxSetup({
        beforeSend: function (xhr, settings) {
            xhr.setRequestHeader("X-CSRFtoken", $.cookie("csrftoken"))
        }
    });
    //csrf请求头 X-CSRFtoken,全局生效

(3)全局:

中间件 django.middleware.csrf.CsrfViewMiddleware


(4)局部:

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect


九、分页(自定义分页)pagination

避免xss攻击


1、模板语言


 

{{ html|safe }}

2、后台views


 

from django.utils.safestring import mark_safe
    tag = mark_safe(tag) # 解析网页标签

参考:

1. Django之Form组件

相关文章
|
10天前
|
数据采集 大数据 数据安全/隐私保护
Python编程:如何有效等待套接字的读取与关闭
Python网络编程中,套接字事件处理至关重要。利用`selectors`模块和代理IP能增强程序的稳定性和可靠性。代码示例展示了如何通过代理连接目标服务器,注册套接字的读写事件并高效处理。在代理IP配置、连接创建、事件循环及回调函数中,实现了数据收发与连接管理,有效应对网络爬虫或聊天应用的需求,同时保护了真实IP。
Python编程:如何有效等待套接字的读取与关闭
|
1天前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
15 6
|
2天前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
22 6
|
5天前
|
数据挖掘 开发者 Python
如何自学Python编程?
【7月更文挑战第14天】如何自学Python编程?
19 4
|
8天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
【7月更文挑战第11天】在Python编程中,图以邻接表或邻接矩阵表示,前者节省空间,后者利于查询连接。通过字典实现邻接表,二维列表构建邻接矩阵。图的遍历包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS使用递归,BFS借助队列。这些基础技巧对于解决复杂数据关系问题,如社交网络分析或迷宫求解,至关重要,能提升编程艺术。
16 5
|
10天前
|
存储 算法 Python
震撼!Python算法设计与分析,分治法、贪心、动态规划...这些经典算法如何改变你的编程世界!
【7月更文挑战第9天】在Python的算法天地,分治、贪心、动态规划三巨头揭示了解题的智慧。分治如归并排序,将大问题拆解为小部分解决;贪心算法以局部最优求全局,如Prim的最小生成树;动态规划通过存储子问题解避免重复计算,如斐波那契数列。掌握这些,将重塑你的编程思维,点亮技术之路。
17 1
|
3天前
|
算法 程序员 计算机视觉
Python并查集:数据结构界的肌肉男,让你在编程路上无所畏惧!
【7月更文挑战第16天】并查集,一种处理不相交集合合并与查询的数据结构,被誉为编程的“肌肉男”。它提供Find(找根节点)和Union(合并集合)操作,常用于好友关系判断、图像处理、集合合并等。Python实现中,路径压缩和按秩合并优化效率。并查集的高效性能使其成为解决问题的强大工具,助力程序员应对复杂挑战。
18 0
|
3天前
|
Python
智慧之光!Python并查集:点亮你的编程思维,让复杂问题迎刃而解!
【7月更文挑战第16天】并查集,一种树型数据结构,用于处理不交集合并与查询。通过路径压缩和按秩合并优化,支持Find(查找元素集合)和Union(合并集合)操作。Python实现简单示例展示如何判断社交网络中用户是否互为好友,高效解决连通性问题,点亮编程思维。
8 0
|
4天前
|
存储 关系型数据库 数据库
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
|
2月前
|
开发框架 开发者 Python
深入探究Python Web开发框架:Flask与Django
Python作为一种广泛应用于Web开发的编程语言,其拥有众多优秀的Web开发框架。本文将深入探讨其中两大知名框架——Flask与Django。通过对它们的概念与实践进行比较分析,帮助读者更好地理解和选择适合自己项目需求的Web开发框架。