• python-day72--django实现的cookie/session


    COOKIE 与 SESSION

    一、概念
    cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
    cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。
    问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。
    我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
    总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。
    另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架

    二、登陆应用
    前几节的介绍中我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面。但是测试后也发现,如果绕过登陆页面。直接输入后台的url地址也可以直接访问的。这个显然是不合理的。其实我们缺失的就是cookie和session配合的验证。有了这个验证过程,我们就可以实现和其他网站一样必须登录才能进入后台页面了。

    先说一下这种认证的机制。每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证。服务器端就会发送一组随机唯一的字符串(假设是123abc)到浏览器端,这个被存储在浏览端的东西就叫cookie。而服务器端也会自己存储一下用户当前的状态,比如login=true,username=hahaha之类的用户信息。但是这种存储是以字典形式存储的,字典的唯一key就是刚才发给用户的唯一的cookie值。那么如果在服务器端查看session信息的话,理论上就会看到如下样子的字典
    {'123abc':{'login':true,'username:hahaha'}}
    因为每个cookie都是唯一的,所以我们在电脑上换个浏览器再登陆同一个网站也需要再次验证。那么为什么说我们只是理论上看到这样子的字典呢?因为处于安全性的考虑,其实对于上面那个大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服务器端也是一样被加密的。所以我们服务器上就算打开session信息看到的也是类似与以下样子的东西
    {'123abc':dasdasdasd1231231da1231231}
    知道了原理,下面就来用代码实现。

    三、Django实现的COOKIE
    1、获取Cookie

    request.COOKIES['key']
    request.COOKIES.get('key',None)    #设置取不到返回None,不报错  ,推荐使用

    2、设置Cookie

    rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
    rep.set_cookie(key,value,...)
    参数:
    
      '''
    
      def set_cookie(self, key,               键
                 value='',            值
                 max_age=None,        超长时间(过多少秒后)
                 expires=None,        超长时间(具体未来的时间对象)
                 path='/',            Cookie生效的路径,/ 表示根路径,根路径的cookie可以被此域名下的任何url页面使用,如指定路径后Cookie只在指定路径内生效
         
              (下方的参数不用了解)  
                         domain=None,         Cookie生效的域名
                                            
                                              你可用这个参数来构造一个跨站cookie。
                                              如, domain=".example.com"
                                              所构造的cookie对下面这些站点都是可读的:
                                              www.example.com 、 www2.example.com 
                             和an.other.sub.domain.example.com 。
                                              如果该参数设置为 None ,cookie只能由设置它的站点读取。
    
                 secure=False,        如果设置为 True ,浏览器将通过HTTPS来回传cookie。
                 httponly=False       只能http协议传输,无法被JavaScript获取
                                             (不是绝对,底层抓包可以获取到也可以被覆盖)
              ): pass
    
      '''

    3 、 由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

    <script src='/static/js/jquery.cookie.js'>
    </script> $.cookie("key", value,{ path: '/' });

    4、删除cookie

    rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
     
    rep.delete_cookie('key',path="/")

    5、总结

    cookie存储到客户端
           优点:
               数据存在在客户端,减轻服务器端的压力,提高网站的性能。
           缺点:
               安全性不高:在客户端机很容易被查看或破解用户会话信息

    四、Django实现的SESSION

    1、设置Sessions值
              request.session['key'] ="val"
    2、获取Sessions值
              request.session["key"]
              request.session.get('key',None)
    3、删除Sessions值    ,应用:注销功能
              del request.session["key"]  删除服务端session表中某条记录中的一组键值
       推荐用:request.session.flush()     删除服务端session表中的某条记录
    def log_out(request):
        """
        直接通过request.session['is_login']回去返回的时候,
        如果is_login对应的value值不存在会导致程序异常。所以
        需要做异常处理
        """
        try:
            #删除is_login对应的value值
            del request.session['is_login']
            
            # OR---->request.session.flush() # 删除django-session表中的对应一行记录
    
        except KeyError:
            pass
        #点击注销之后,直接重定向回登录页面
        return redirect('/login/')
    注销注意事项
    1.设值session过程:
        requset.session["IS_LOGON"]=True
        requset.session["USER"]=usernamereturn 
       redirect("/home/")
       过程分析:
    1. 生成一个随机字符串,赋值给变量s s="sdgsdfg4565dfgsdfgsdf" 2. 在服务端django-session表中,添加一条记录 insert into django-session values (s,"{"IS_LOGON":True,"USER":egon}",过期时间(秒)) 3. obj=redirect("/home/")
        obj.set_cookie("sessionID",s)
        return obj 
       下次浏览器再访问服务端时如果cookie验证成功,服务端就知道你是你了 


    2.取值session:

      request.session.get(
    "IS_LOGON",None)

    过程分析:
       在django
    -session表中,进行查询: s=requset.COOKIE.get("sessionID") select session-data from django-session where session-key=s; 再从session-data中查询"IS_LOGON"对应的值
    优点:服务器上保存用户的信息,客户端上只有cookie的值并没有用户的信息,相对安全 

    、、、session存储的相关配置

    (1)数据库配置(默认):

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

    (2)缓存配置 

    配置 settings.py
      
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
        SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
      
      
        SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
        SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
        SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
        SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
        SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存
        
    View Code

    (3)文件配置

    配置 settings.py
      
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
        SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()         
        SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
        SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
        SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
        SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
        SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存
    View Code
  • 相关阅读:
    第八周作业
    第七周上机作业2
    神经网络基础
    [网鼎杯 2020 青龙组]AreUSerialz
    BJDCTF 2nd old-hack
    php反序列化漏洞学习
    CTFHUB-HTTP协议
    ctfhub-密码口令
    CTFHUB-信息泄漏
    buuctf-[BJDCTF 2nd]elementmaster
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7767116.html
Copyright © 2020-2023  润新知