热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入分析理解session与cookie的作用-PHP源码

session与cookie在web开发中我们用到的不少了,那么关于session与cookie你有深入理解吗?今天我们就一起来看一篇关于深入分析理解session与cookie的作用的例子。
session与COOKIE在web开发中我们用到的不少了,那么关于session与COOKIE你有深入理解吗?今天我们就一起来看一篇关于深入分析理解session与COOKIE的作用的例子。

在Web发展历史中,session与COOKIE都是伟大的存在,其初衷都是为了记住用户在网站上的浏览信息,如果没有其他替代品的出现,几乎所有web站点都离不开session与COOKIE。

为什么需要

Http协议是无状态的,也就导致服务器无法分辨是谁浏览了网页。为了维持用户在网站的状态,比如登陆、购物车等,出现了先后出现了四种技术,分别是隐藏表单域、URL重写、COOKIE、session。

COOKIE

为了解决Http协议无法维持状态的问题,1994年网景通讯的一名员工 Lou Montulli将 “magic COOKIEs” 的概念应用到 Web 通讯中。他试图解决 Web 的第一个购物车应用,现在购物车成了购物网站的支柱。他的原始说明文档提供了 COOKIE 工作原理的基本信息,该文档后来被作为规范纳入到 RFC 2109(大多数浏览器的实现参考文档)中,最终被纳入到 RFC 2965 中。Montulli 也被授予 COOKIE 的美国专利。网景浏览器在它的第一个版本中就开始支持 COOKIE,现在所有 Web 浏览器都支持 COOKIE。(这里只介绍COOKIE与session)

是什么

COOKIE是浏览器保存在用户电脑上的一小段文本,用来保存用户在网站上的必要的信息。Web页面或服务器告诉浏览器按照一定的规范存储这些信息,并且在以后的所有请求中,这些信息就会自动加在http请求头中发送给服务器,服务器根据这些信息判断不同的用户。并且COOKIE本身是安全的。

如何创建

Web 服务器通过发送一个称为 Set-COOKIE 的 HTTP 消息头来创建一个 COOKIE,Set-COOKIE消息头是一个字符串,其格式如下(中括号中的部分是可选的):

Set-COOKIE: value[; expires=date][; domain=domain][; path=path][; secure]
value

value 部分,通常是一个 name=value 格式的字符串。事实上,这种格式是原始规范中指定的格式,但是浏览器并不会对 COOKIE 值按照此格式来验证。实际上,你可以指定一个不含等号的字符串,它同样会被存储。然而,最常用的使用方式是按照 name=value 格式来指定 COOKIE 的值(大多数接口只支持该格式)。

发送回服务器的COOKIE只包含COOKIE设置的值,而不包含COOKIE的其他可选项,而且浏览器不会对COOKIE做任何更改,会原封不动的发送回服务器。当存在多个COOKIE时,用分号和空格隔开:

COOKIE: name=value; name1=value1; name2=value2/pre>

COOKIE过期时间

如果不设置COOKIE过期时间,COOKIE会在会话结束后销毁,称为会话COOKIE。如果想将会话COOKIE设置为持久COOKIE,只需设置一下COOKIE的过期时间即可,该选项的值是一个 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值。注意这个失效日期则关联了以 name-domain-path-secure 为标识的 COOKIE。要改变一个 COOKIE 的失效日期,你必须指定同样的组合。

持久COOKIE是无法改成会话COOKIE,除非删除这个COOKIE,然后重新建立这个COOKIE。

domain 选项

domian选项设置了COOKIE的域,只有发向这个域的http请求才能携带这些COOKIE。一般情况下domain会被设置为创建该COOKIE的页面所在的域名。

像 Yahoo! 这种大型网站,都会有许多 name.yahoo.com 形式的站点(例如:my.yahoo.com, finance.yahoo.com 等等)。将一个 COOKIE 的 domain 选项设置为 yahoo.com,就可以将该 COOKIE 的值发送至所有这些站点。浏览器会把 domain 的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的 COOKIE 发送至服务器。

path 选项

path选项和domain选项类似,只有包含指定path的http请求才能携带这些COOKIE。这个比较通常是将 path 选项的值与请求的 URL 从头开始逐字符比较完成的。如果字符匹配,则发送 COOKIE 消息头,例如:

set-COOKIE:namevalue;path=/blog
所以包含/blog的http请求都会携带COOKIE信息。

secure 选项

该选项只是一个标记而没有值。只有当一个请求通过 SSL 或 HTTPS 创建时,包含 secure 选项的 COOKIE 才能被发送至服务器。这种 COOKIE 的内容具有很高的价值,如果以纯文本形式传递很有可能被篡改。

事实上,机密且敏感的信息绝不应该在 COOKIE 中存储或传输,因为 COOKIE 的整个机制原本都是不安全的。默认情况下,在 HTTPS 链接上传输的 COOKIE 都会被自动添加上 secure 选项。

HTTP-Only

HTTP-Only 的意思是告之浏览器该 COOKIE 绝不能通过 Javascript 的 document.COOKIE 属性访问。设计该特征意在提供一个安全措施来帮助阻止通过 Javascript 发起的跨站脚本攻击 (XSS) 窃取 COOKIE 的行为。

Javascript 操作 COOKIE

在 Javascript 中通过 document.COOKIE 属性,你可以创建、维护和删除 COOKIE。创建 COOKIE 时该属性等同于 Set-COOKIE 消息头,而在读取 COOKIE 时则等同于 COOKIE 消息头。

删除COOKIE

会话 cooke (Session COOKIE) 在会话结束时(浏览器关闭)会被删除。
持久化 COOKIE(Persistent COOKIE)在到达失效日期时会被删除。
如果浏览器中的 COOKIE 数量达到限制,那么 COOKIE 会被删除以为新建的 COOKIE 创建空间。
session
session的作用和COOKIE差不多,也是用来解决Http协议不能维持状态的问题。但是session只存储在服务器端的,不会在网络中进行传输,所以较COOKIE来说,session相对安全一些。但是session是依赖COOKIE的,当用户访问某一站点时,服务器会为这个用户产生唯一的session_id,并把这个session_id以COOKIE的形式发送到客户端,以后的客户端的所有请求都会自动携带这个COOKIE(前提是浏览器支持并且没有禁用COOKIE)。

用下面这个图来了解下session的工作原理:


禁用COOKIE时如何使用session

有些时候,为了安全浏览器会禁用COOKIE,这时可以用传参的方式将session_id发送到服务器,session可以照常工作。

删除session

会话关闭后,session会自动失效,如果想手动删除session,可以在服务器端编程实现。如PHP是这样做的

$_SESSION = array();
session_destory();

推荐阅读
  • php生成shtml类用法的简单介绍
    本文目录一览:1、phpcmsv9怎么生成shtml ... [详细]
  • 2月4日每日安全热点节日期间某企远程办公遭XRed攻击 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • JVM(三)虚拟机栈 多合一总述
    虚拟机栈概述虚拟机栈出现背景:由于跨平台性的设计,Java的指令都是根据栈来设计的。不同CPU架构不同,所以不能设计为基于寄存器的跨平台的优点:指令集小,编译器容易实现,缺点是性能 ... [详细]
  • 通过存储型XSS漏洞获取目标用户本地私钥信息
    运维|安全存储型XSS漏洞,目标用户,本地,私钥信息运维-安全舍得网源码,vscode代码检查工具,ubuntu壁纸修改,tomcat网页部署项目,爬虫枯木,php采集文件,马鞍山 ... [详细]
  • JDK1.7及之前的JMM先看一张图,很清晰的说明了JAVA内存结构布局:JAVA内存结构主要分为三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块内存,由年轻代和老年代组成。 ... [详细]
  • 用JavaScript实现的太空人手表
    用JavaScript实现的太空人手表-JS写的太空人手表,没有用canvas、svg。主要用几个大的函数来动态显示时间、天气这些。天气的获取用到了AJAX请求。代码中有详细的注释 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
ii贵妇狗_156
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有