关于Cookie与Session

Cookie与Session应该在HTTP协议中会有较准确详细的描述,这里我根据平时看到的资料总结自己的认识如下:

1,Cookie是存储在客户端电脑上面,具有name, domain, expire等属性。

2,出于安全考虑,不能够跨域取cookie,比如a.com的cookie只能由a.com, x.a.com, y.a.com等站点读取,b.com则不可以。

3,cookie具有有效期,一般默认是浏览器关闭则失效,要删除cookie,可以简单的将有效期设置为昨天。

4,客户端每次向服务器发送Request的时候均会自动带上cookie,因此cookie大小不能超过4KB;服务器端通常只是在响应客户端起初的请求时才发送cookie,这里应该是程序控制写入cookie才发送,否则Response不会带cookie。因为cookie主要是用于标示客户端用户的一些信息,而HTTP协议是stateless的,因此若客户端不带上cookie,服务器端无法识别其历史对话信息。

5,对于一些浏览器端禁用cookie的情况,可以通过URL参数或其他形式保留此信息。

6,Session是存储于服务器端,存储客户端会话信息,其实与cookie一样都是存储一些键值对。

7,既然http是stateless的,那么服务器端是如何将session与客户端对应的呢?这里猜想可能是在最初客户端请求时,服务器端为其生成一个session,并将sessionid告诉客户端,每次客户端通过cookie或者其他方式自动带上这个sessionid,那么服务器段就知道它对应哪个session了。并且位于服务器端的session对象可以存储较多的内容。

8,当sessionid被截取后可能会引发安全问题,比如另外一台客户端可以携带该sessionid发送请求模拟登陆,这时我们通常需要通过SSL来解决安全问题。若没有SSL机制,比较简单的办法就是在初始阶段存储客户端的ip地址,http_user_agent等信息,每次处理请求的时候进行一下校验。当然这仍然不是很安全。

9,为了防止黑客自动构造大量sessionid来模仿其他用户,可以在每次session初始化时调用regenerate方法:

<?php
session_start();
if (!isset($_SESSION['initiated']))  //这里是否会识别来自于特定终端的第一次请求,因为不可能每次请求的时候都重新产生一次id
{
session_regenerate_id();
$_SESSION['initiated'] = 1;
}
if (!isset($_SESSION['count'])) $_SESSION['count'] = 0;
else ++$_SESSION['count'];
echo $_SESSION['count'];
?>

10,sessionid的传递应该至少有2种,1种是基于cookie的,另外一种是基于get方法的,比如….?phpsessionid=2321

可以通过ini_set('session.use_only_cookies', 1);强制sessionid基于cookie传送,那么基于get方法的就失效了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值