Python编程:Django之安全验证

简介: 涉及内容装饰器cookiesessionform验证缓存中间件信号csrf分页

涉及内容

  1. 装饰器
  2. cookie
  3. session
  4. form验证
  5. 缓存
  6. 中间件
  7. 信号
  8. csrf
  9. 分页

一、装饰器

鉴权装饰器函数

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

相关文章
|
19天前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
1月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
76 11
|
26天前
|
数据采集 存储 数据可视化
2025python实战:利用海外代理IP验证广告投放效果
本文介绍了如何利用Python结合海外代理IP技术,验证广告在不同国家的实际投放效果。通过模拟各地网络环境访问广告页面,检查内容是否与计划一致,并生成曝光报告。具体实现包括:获取高质量代理IP、使用Selenium或Playwright模拟用户行为、解析广告内容及生成可视化报告。案例显示,该方法能有效确保广告精准投放,优化策略并节省预算。
|
3月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
133 28
|
2月前
|
前端开发 JavaScript 关系型数据库
基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。
108 6
|
3月前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
59 4
|
3月前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
3月前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
3月前
|
数据采集 文字识别 API
Python爬虫模拟登录并跳过二次验证
Python爬虫模拟登录并跳过二次验证
|
开发框架 开发者 Python
深入探究Python Web开发框架:Flask与Django
Python作为一种广泛应用于Web开发的编程语言,其拥有众多优秀的Web开发框架。本文将深入探讨其中两大知名框架——Flask与Django。通过对它们的概念与实践进行比较分析,帮助读者更好地理解和选择适合自己项目需求的Web开发框架。

推荐镜像

更多