您当前的位置: 首页 >  Python

Python编程:Django之安全验证

彭世瑜 发布时间:2018-03-17 15:16:31 ,浏览量:4

涉及内容
  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组件

关注
打赏
1688896170
查看更多评论

彭世瑜

暂无认证

  • 4浏览

    0关注

    2727博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.2983s