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

相关文章
|
29天前
|
数据采集 中间件 Python
如何在Django框架中进行输入验证和过滤?
通过综合运用这些方法,可以在 Django 框架中有效地进行输入验证和过滤,提高应用的安全性和数据质量。同时,还可以根据具体的业务需求进一步扩展和定制验证逻辑。
106 64
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
187 45
|
29天前
|
监控 安全 测试技术
Django框架的表单验证和过滤机制是否可以应对复杂的安全场景?
综上所述,Django 框架的表单验证和过滤机制在一定程度上可以应对复杂的安全场景,但需要综合运用多种手段来进一步提升安全性,以适应不断变化的安全挑战。
30 1
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
68 2
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
44 1
|
2月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
47 4
|
2月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第10天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django以功能全面、文档完善著称,适合快速开发;Flask轻量灵活,易于上手;Pyramid介于两者之间,兼顾灵活性和安全性。选择框架时需考虑项目需求和个人偏好。
40 1
|
2月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
54 4
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
246 4
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
149 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面