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组件

相关文章
|
7天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
11天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
9天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
1天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
12 0
|
2天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
22 0
|
16天前
|
前端开发 测试技术 数据库
【python】为什么使用python Django开发网站这么火?
【python】为什么使用python Django开发网站这么火?
|
21天前
|
程序员 C语言 Python
Python列表推导式:简洁与高效的编程利器
在Python编程中,列表推导式(List Comprehension)是一种强大且优雅的工具,它允许我们以简洁的方式创建新的列表。列表推导式在Python程序员中广受欢迎,因为它能够将复杂的循环和条件语句简化为一行代码,提高代码的可读性和执行效率。
|
28天前
|
缓存 分布式计算 自然语言处理
Python语言的函数编程模块
Python语言的函数编程模块
|
2月前
|
安全 调度 Python
什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?
【2月更文挑战第4天】【2月更文挑战第9篇】什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?