WEB的cookie & session mechanism

cookie

看了些关于cookie与session机制的文章..这里写下我看完后自己对这两者的理解…

作用:
两者的作用都是用来识别用户身份, 区别在于储存的地点不同, session存在服务器上, cookie在客户端…

由于cookie是存在客户端的浏览器或硬盘上, 所以通过软件可以很容易的进行查看修改, 而xss的主要目的就是获取到用户的cookie. 所以, cookie相对来说更不安全.

因此, 要使用cookie的话,

  1. 识别用户身份的cookie不能被找出规律.
  2. 重要的cookie最好加上onlyhttp. 防止站点存在xss的情况下重要cookie被盗.

而存储在服务器上的session相对来说就安全多了…但是却有一个致命的弱点,就是它存在服务器上. 一个站点, 客户端只需要连接该站点的服务器, 而服务器却要接收所有连接该服务器的客户端请求. 所以当访问量很大的情况下, session将会造成服务器巨大的负荷. 这就是cookie至今没被淘汰的理由..

所以, cookie与session的结合才是目前的主流…


当cookie没设置存活时间时, 默认的是会话, 意思是浏览器打开的期间, 可以自己实验下, 对于那些存活时间是会话的cookie, 关闭浏览器, 然后在打开该网站, cookie就会变动..

当用php启用session的时候, 服务器将会set一个cookie到服务器, 默认是PHPSESSION,(可以在session_start()之前通过session_name()进行设置) 值就是改用户session的id. 服务器就是用该id来识别该用户是服务器的哪个session. session的默认生命周期结束于一个销毁的函数(比如php用session_destroy()),或者24min. 服务器也可以对session上面说的内容进行设置.

然而我却发现一个问题, PHPSESSION的值是session_id的, 如果没把该值设为onlyhttp, 那该值被x走了后, 不就相当于session被X了?

而cookie 和 session如何使用才最合理. 目前我仍在摸索之中…..


设置参数补充…

1

php.ini:
  session.cookie_httponly = 1  //这样sessionid的cookie就被设置为httponly了
  //服务器默认是不设置httponly, 所以修改该配置对于移植性不好, 所以可以这么写
  //在session_start()前
  ini_set('session.cookie_httponly',1);
  //默认
  session.cookie_lifetime = 0 //该值为sessionid的cookie生命周期, 0为会话周期.
  //同样在session_start()前可以进行设置
  ini_set('session.cookie_lifetime', 60);  //60秒
  session.gc_maxlifetime = 1440; //该值为session在服务器端的生命周期, 默认1440s(24min)
  ini_set('session.gc_maxlifetime',60); //php可以通过这样进行设置. 建议和cookie的生命周期相同
  
  session.save_path = /tmp   //可通过修改这值来修改session保存路径
  session_save_path('/tmp');    //或者该php函数

httponly, 生命周期, 还有一个重要的设置是路径….可是我还没领悟出其中的真意….


在linux中, session默认是保存在 /tmp/ 目录下

下面的php代码

1
2
3
4
5
6
7
8
9
<?php
session_name('fjdsl');
session_id('abcd');
ini_set('session.cookie_httponly',1);
ini_set('session.cookie_lifetime',60);
session_start();
$_SESSION['sdf'] = 342;
$_SESSION['ddf'] = 'vsdsdf';
?>

出现的session为:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ll /tmp/
-rw-------. 1 www www 0 77 11:18 sess_5gd292k7dimfig67aej4okuub0
-rw-------. 1 www www 0 77 11:08 sess_7kuqo2ct3sel40g22e073ol487
-rw-------. 1 www www 0 77 11:02 sess_7vd2rc8ui1aae9dr8kip7j4b06
-rw-------. 1 www www 27 77 11:20 sess_abcd
-rw-------. 1 www www 0 77 10:51 sess_fbcb1u38k3uor3fns2acjsj3t4
-rw-------. 1 www www 0 77 10:59 sess_fv3vmv35a3jo5795p2mo2q8bf7
-rw-------. 1 www www 0 77 10:43 sess_gii68oe5hlcsishbag6hh6ftc3
-rw-------. 1 www www 0 77 10:59 sess_qighhgepemj4hq7mbvb3l767l5
-rw-------. 1 www www 0 77 10:58 sess_vasdrjk1qkmvi057itaho8gt76
$ sudo cat sess_abcd
sdf|i:342;ddf|s:6:"vsdsdf";%
#看来是以序列化的方式储存

===================php关于session的函数============

session_abort — Discard session array changes and finish session
session_cache_expire — 返回当前缓存的到期时间
session_cache_limiter — 读取/设置缓存限制器
session_commit — session_write_close 的别名
session_decode — 解码会话数据
session_destroy — 销毁一个会话中的全部数据
session_encode — 将当前会话数据编码为一个字符串
session_get_cookie_params — 获取会话 cookie 参数
session_id — 获取/设置当前会话 ID
session_is_registered — 检查变量是否在会话中已经注册
session_module_name — 获取/设置会话模块名称
session_name — 读取/设置会话名称
session_regenerate_id — 使用新生成的会话 ID 更新现有会话 ID
session_register_shutdown — 关闭会话
session_register — Register one or more global variables with the current session
session_reset — Re-initialize session array with original values
session_save_path — 读取/设置当前会话的保存路径
session_set_cookie_params — 设置会话 cookie 参数
session_set_save_handler — 设置用户自定义会话存储函数
session_start — 启动新会话或者重用现有会话
session_status — Returns the current session status
session_unregister — Unregister a global variable from the current session
session_unset — Free all session variables
session_write_close — Write session data and end session