本文主要是毕业设计"个人电脑使用记录清除软件"系列系统应用文章中关于cookie方面的知识,主要从介绍cookie的基础知识和php关于cookie\session两个会话管理机制的讲述.结合自己的php课程及cookie方面的文章.提醒:由于作者写时有点晚,思路有些乱,文章论述和排版都不太满意,太杂乱无章,请海涵!
<一>.什么是cookie?
cookie总是保存在客户端中,按在客户端的存储位置,分为内存cookie和硬盘cookie.其中内存cookie由浏览器维护,保存在内存中,浏览器关闭就会消失.硬盘cookie保存在硬盘里,除非用户手动清理或过期,将长期保存.
<二>.cookie工作原理
cookie是由服务器通过在http响应头中加上特殊指示生成,发送给浏览器,浏览器将cookie的value保存到某目录文件夹内,下次请求同一网站时就发送cookie给服务器.服务器可以设置或读取cookies中包含信息,维护用户跟服务器会话中的状态.其中,cookies最典型的应用是判断用户登录网站信息和保存网站输入文字|选择等页面信息.
下图非常完美的诠释了cookie机制.
<三>.windows文件路径(补充)
下面补充与该项目相关的浏览器历史记录和cookie存储位置,以便历史记录清除操作(仅以自己的电脑参考).
1.windows中cookie保存位置为"c:\users\dell\appdata\roaming\microsoft\windows\cookies".cookie记录用户id、密码、浏览器过的网页、停留时间等信息.如下图所示:
2.windows中internet临时文件位置为"c:\users\dell\appdata\local\microsoft\windows\temporary internet files",它存放着最近浏览过的网页的内容(网页|图像|媒体副本等)以便以后快速查询并提高速度.如下图所示:
3.windows中ie历史记录位置为"c:\users\dell\appdata\local\microsoft\windows\history",历史记录是存放最近时间访问过的网站地址,它以时间和站点存储.如下图所示:
<一>.什么是session?
说到cookie,就不得不谈谈session.它究竟是又什么呢?它俩的区别是什么呢?
session(会话)是指一个终端用户与交互系统进行通信的时间间隔,通常指从进入网站到浏览器关闭所经过的时间.当程序需要为某个客户端请求创建一个session时,服务器先检查客户端的请求是否包含一个session唯一标识session
id(被存储于本地cookie中),如果包含则说明此客户端已创建过session,服务器就按session id把该session检索使用;如果不包含则为此客户端创建一个session并生成一个与session相关联的session id(它唯一标识符,不会重复又不容易被造访的长串字符串).访问网站的来客分配的唯一标识session id要么存放在客户端的cookie中(session使用过期时间设为0的cookie),要么经由url传递.
补充:session是由服务器端存储,当用户连接服务器时会由服务器生成一个会话id(session id),用该标识符来存取服务端的session存储空间.而sessionid保存在客户端,用cookie保存,当用户提交页面时,会将sessionid提交到服务器处理session数据.而一旦客户端禁用cookie,session也会失效.
<二>.session和cookie对比
cookie许多用途与session相同,两种机制保存一些用户交互的信息.它们存在区别如下:
1.两者最大的区别是cookie存储在客户端的一小段信息,它完全存储在用户计算机上并加载到浏览器缓存中;session数据存放在服务器上.
2.session使用具有一定局限性,但由于数据保存在服务器端,提供了很好的安全性;cookie使用比较方便,但不是很安全.黑客通过存储在本地的cookie进行cookie欺骗\跨站脚本攻击.(http明文传输,https加密)
3.由于cookie存储在本地且cookie的大小限制在4kb,对于复杂存储需求不够;由于session保存在服务器上,当访问增多时,会大量占用服务器的性能.
<一>.设置cookie
可以用setcookie()或setrawcookie()函数设置cookie,也可以通过向客户端直接发送http头来设置.其中setcookie:
设置多个cookie变量setcookie('var[a]','value');用数组表示变量,用$_cookie['var']['a']来读取该cookie变量.亦可使用header()设置cookie,读者可自己查找资料.
<二>.读取cookie
直接用php内置超级全局变量$_cookie读取浏览器端的cookie.
可以发现使用setcookie函数设置的两个cookie,其中cookie名称为abc,值为123;cookie名称为testcookie,值为something,而且它的过期时间为1小时后,并使用print_r和echo输出.
<三>.删除cookie
只要把有效时间设为小于当前时间(失效时间),和把值设置为空.setcookie("testcookie","",time()-1);
结果如下图所示,可以发现testcookie的数据已经被删除.只剩下abc的数据.
在使用php登录时可以使用下面这段代码,感觉比较实用的一段代码:
<一>.session启动
使用session_start()启用session,服务器段在生成session文件同时生成session id哈希值和默认phpsessid的session name,并向客户端发送变量为phpsessid(session name),值为一个128位哈希值.服务器端将通过该cookie与客户端交互.
session通过cookie传送session id,即服务器自动发送http头.当从该页面跳转到新页面并调用session_start()后,php将检查与给定id相关的服务器段存储的session数据,如未找到则创建一个新的数据集.
<二>.session访问及读取
通过url传送session id, 也可以通过post来传递session值.可以使用php内置的$_session变量可以方便的访问设置的session变量并给它赋值,如$_session['xxx']='yyy'.使用echo和print_r输出session值.
输入如下图所示,可以看到session id对应的长串字符串:
<三>.session删除
session的删除需要三步,第一步删除服务器端的session,第二步删除实际的session,第三部删除$_session全局变量数组.代码如下:
<四>.session安全问题
攻击者通过投入很大精力获取用户的会话id,他们就可以在系统中拥有与此用户相同的能力,因此校验session id的有效性是保护session安全.下面一段代码是我php项目时判断数据库mysql中session用户名和密码的功能(作为自己以后的笔记):
由于该“系统应用”系列文章都是采用c#语言完成,而该篇讲述的php仅仅是对以前学习课程的巩固,是对后面的采用c#读取cookie和清除cookie等历史记录的前提,所以题目命名是c#.同时确实文章写得太晚,同时思路有些乱,本应该是几篇文章的我一篇写完了,所以请大家见谅!该文章主要来自《lampwamp架构与开发》ppt课件,同时感谢我的cr老师和上面文章的作者.
最后希望该文章对大家有所帮助,尊重作者的劳动果实,如果有错误或不足之处,请大家海涵!有点后悔当初学习php和数字图像处理时没多写几篇系列文章.