问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么说session比cookie安全??

发布网友 发布时间:2022-05-01 20:37

我来回答

2个回答

懂视网 时间:2022-05-10 10:24

本篇文章给大家带来的内容是关于python中Cookie和Session的详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

cookie

1、Cookie的由来

大家都知道HTTP协议是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

2、什么是Cookie

Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

3、Cookie的原理

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

Django中操作Cookie

1、获取Cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

参数:

  • default: 默认值

  • salt: 加密盐

  • max_age: 后台控制过期时间

  • 2、设置Cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)

    参数:

  • key, 键

  • value='', 值

  • max_age=None, 超时时间

  • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)

  • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问

  • domain=None, Cookie生效的域名

  • secure=False, https传输

  • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

  • 3、删除Cookie

    def logout(request):
     rep = redirect("/login/")
     rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
     return rep

    Session

    Session的由来

    Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

    问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

    另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

    Django中Session相关方法

    # 获取、设置、删除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()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() 
     这用于确保前面的会话数据不可以再次被用户的浏览器访问
     例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
     * 如果value是个整数,session会在些秒数后失效。
     * 如果value是个datatime或timedelta,session就会在这个时间后失效。
     * 如果value是0,用户关闭浏览器session就会失效。
     * 如果value是None,session会依赖全局session失效策略。

    1、Session流程解析

    2、Django中的Session配置

    Django中默认支持Session,其内部提供了5种类型的Session供开发者使用。

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
    SESSION_CACHE_ALIAS = 'default'    # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
    SESSION_FILE_PATH = None     # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
    
    其他公用设置项:
    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,默认修改之后才保存(默认)
    
    Django中Session相关设置
    
    Django中Session相关设置

    Django中Session相关设置

    3、CBV中加装饰器相关

    CBV实现的登录视图

    class LoginView(View):
    
     def get(self, request):
     """
     处理GET请求
     """
     return render(request, 'login.html')
    
     def post(self, request):
     """
     处理POST请求 
     """
     user = request.POST.get('user')
     pwd = request.POST.get('pwd')
     if user == 'alex' and pwd == "alex1234":
      next_url = request.GET.get("next")
      # 生成随机字符串
      # 写浏览器cookie -> session_id: 随机字符串
      # 写到服务端session:
      # {
      # "随机字符串": {'user':'alex'}
      # }
      request.session['user'] = user
      if next_url:
      return redirect(next_url)
      else:
      return redirect('/index/')
     return render(request, 'login.html')

    要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:

    from django.utils.decorators import method_decorator

    1. 加在CBV视图的get或post方法上

    from django.utils.decorators import method_decorator
    
    
    class HomeView(View):
    
     def dispatch(self, request, *args, **kwargs):
     return super(HomeView, self).dispatch(request, *args, **kwargs)
    
     def get(self, request):
     return render(request, "home.html")
     
     @method_decorator(check_login)
     def post(self, request):
     print("Home View POST method...")
     return redirect("/index/")

    2. 加在dispatch方法上

    from django.utils.decorators import method_decorator
    
    
    class HomeView(View):
    
     @method_decorator(check_login)
     def dispatch(self, request, *args, **kwargs):
     return super(HomeView, self).dispatch(request, *args, **kwargs)
    
     def get(self, request):
     return render(request, "home.html")
    
     def post(self, request):
     print("Home View POST method...")
     return redirect("/index/")

    因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。

    3. 直接加在视图类上,但method_decorator必须传 name 关键字参数

    如果get方法和post方法都需要登录校验的话就写两个装饰器。

    from django.utils.decorators import method_decorator
    
    @method_decorator(check_login, name="get")
    @method_decorator(check_login, name="post")
    class HomeView(View):
    
     def dispatch(self, request, *args, **kwargs):
     return super(HomeView, self).dispatch(request, *args, **kwargs)
    
     def get(self, request):
     return render(request, "home.html")
    
     def post(self, request):
     print("Home View POST method...")
     return redirect("/index/")

    热心网友 时间:2022-05-10 07:32

    1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。何乐而不为呢。
    2,session的sessionID是放在cookie里,要想功破session的话,第一要功破cookie。功破cookie后,你要得到 sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录,所以即使你劫持了cookie,也不一定里面含有sessionid。
    3 第二,sessionID是加密的(由服务端的加密后返回,python的web框架,Django里面的secret_key,就是用来加密的,当然你也可以手动设置加密是的盐),第二次session_start的时候,前一次的sessionID就没有用了(因为加密的盐中带有时间戳等信息),
    4. session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了,而真正的cookie存在于客户端硬盘上的一个文本文件,谁安全很显然了。
    5,如果session这么容易被功破,这么不安全的话,我想现有的绝大部分网站都不安全了。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    孤胆枪手怎么设置局域网啊、 我家小狗刚领来,没有名字,拜托大家起个名字。 护肤品代加工 水浒Q传跨服PK是怎么回事啊 新水浒Q传什么叫PK保护状态,上号不到一分钟就被打,求解 水浒Q传 为什么要pk有什么好处? 为什么贷款每次都审核失败 有谁能说一下手机贷审核不通过的原因吗?我都审核好多次了都不能通过... 贷款审核失败是什么原因 为什么贷款未通过审核 世态炎凉, 冷暖自知是什么意思 闪送派单员一天工作多长时间有要求吗 上午美团下午闪送可以吗? 想试试乐友APP上的乐闪送服务,会有配送时间限制吗? 欢乐谷玛雅水公园几点开放 求长江下游河段特征 请问苏州乐园水上世界几点关门,一般几点去比较好 我想做闪送员送单时有时间规定内送达吗? 长江和黄河的河段划分 苏州水上乐园什么时候开放 深圳欢乐谷什么时候是玛雅水公园开放期间? 杭州水上乐园营业到几月份,营业时间是几点到几点?还有杭州乐园和水上乐园是在一起的吗?? 杭州乐园的水上乐园几点开放?? 长江各河段的特征及利用方式是什么? 长隆水上乐园几点开门 水立方水上乐园的开放时间 开平金山水上乐园营业时间 杭州乐园水世界的开放时间多少? 一个关于长江各河段特征的问题 苏州水上乐园晚上的开放是几点开放? python3.5 爬虫 session怎么用 python session问题 python的session问题 flask 的 g 和session 的区别怎样理解 python session 可以存储多大 python 通过一个函数取得的session ,另一个函数怎么调用这个sesion_百度... 求教,看python 的书时,里面提到terminal session是什么意思,怎么进入。谢谢。。。 python有操作SESSION行为方式的函数吗 哪个在线律师网比较靠谱? 菩提果为什么有粉色的 有专门提供律师行业学习的网站吗?? 菩提子有粉色的吗 华律网律师在线咨询靠谱吗 月经量大是好事还是坏事? 月经量大是什么体验 关于莲文化的~ 月经量大该怎么办呢? 粉色菩提子多少钱一颗? 莲文化的魅力有关的手抄报版面设计 哪个网站可以咨询律师