zoukankan      html  css  js  c++  java
  • PHP SESSION机制,从存储到读取

    PHP中,如果要获取SESSION数据,必须要有对应的session_id,session_id的获取方式有两种

    1.基于客户端的cookie

    2.基于url

    先说第一种情况,基于客户端的cookie.服务器端的脚本在开启session后,会依据php.ini来存储session,下面列举一些

    session.save_handler 定义存储和获取与会话关联的数据的处理器的名字。默认为 files。如果设定为files(session.save_handler = files),则采用的是php内置机制,如果想自定义存储方式(比如存储到数据库中),则使用session_set_save_handler()进行自定义设置

    session.save_path 定义了传递给存储处理器的参数(注释1)。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp,也可以修改,比如session.save_path = "e:/wamp/tmp"。也可以使用session_save_path()在脚本中设定(一定在session_start前设定)

    举例

    假设脚本是session.php

    session_save_path(getcwd()."/session_folder");//为方便我已经创建好session_folder这个目录
    session_start();
    $_SESSION['aa']='bb';
    $_SESSION['cc']='dd';

    运行完毕,查看session_folder目录

    如果一个服务器上有多个项目,那么每个项目设定不同的session_save_path是有必要的,因为PHP会根据session的的垃圾回收机制,来清理默认session目录下的session文件:项目A的php脚本在运行时,极有可能删掉项目B的php脚本生成的session文件.所以,每个项目采用不同的session路径,并在session_start()前,就指定session路径,就互不干扰了.

    看这个session文件的名字,其中sess_后面的一大串就是session_id,可以用session_id()设置/读取;

    打开这个文件,看一下

    aa|s:2:"bb";cc|s:2:"dd";

    这是session的序列化处理器序列化的数据,默认值是php(session.serialize_handler = php),

    浏览器请求这个文件后,服务器会返回这样的响应头

    response header

    Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Connection:Keep-Alive
    Content-Length:0
    Content-Type:text/html; charset=utf-8
    Date:Fri, 18 Nov 2016 14:55:24 GMT
    Expires:Thu, 19 Nov 1981 08:52:00 GMT
    Keep-Alive:timeout=5, max=100
    Pragma:no-cache
    Server:Apache/2.4.9 (Win32) PHP/5.5.12
    Set-Cookie:PHPSESSID=193tha35k5fj547nbj6o108as3; path=/
    X-Powered-By:PHP/5.5.12

    黄色部分就是服务器返回的cookie

    这个cookie是php生成的,

    名:PHPSESSD;

    这个PHPSESSID是会话名,是在php.ini中设定:session.name = PHPSESSID,也可以使用session_name()来读取/设定

    值:193tha35k5fj547nbj6o108as3;

    这个id值就是存储在服务器端的文件的名字啦

    路径:/

    路径也是php.ini中设定:session.cookie_path = /  ,也可以session_set_cookie_params() 设定或session_get_cookie_params()读取.

    另外,查看这个cookie的生命周期,偷懒我就直接看浏览器了

    可以看到过期时间是关闭浏览器的时候

    这个值是php.ini中session.cookie_lifetime设定的(session.cookie_lifetime = 0), 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。也可用 session_get_cookie_params()读取或session_set_cookie_params() 设定

    另外,我再次访问session.php,使用js读取cookie

    这么重要的数据,js竟然读取到了,万一被XSS攻击了怎么办,不行,这个cookie不能被js获取,要设定一下

    php.ini中,session.cookie_httponly=on,这样js就不会获取到啦

    如果用户的浏览器禁用cookie怎么办?

    如果禁用了cookie,而php又没有进行额外设置,则php无法读取cookie,也无法获取session值,因为php.ini中默认是这样设定的:

    session.use_only_cookies = 1,意思是说,php只能根据cookie中的PHPSESSID的值来存入/获取/修改会话id,这样做是相对安全的,也是php推荐的,因而在此设定值下,如果禁用了cookie,就获取不到session啦

    可是,我就是想在禁用cookie的情况下也要设定/读取session值怎么办?php也是允许的,这就是session的第二种获取方式,就是基于URL

    php.ini有个选项值:session.use_trans_sid,

    设置session.use_trans_sid=on,就可以基于URL来传递会话id,比如我设定session时把session_id()存储在一个隐藏域中,

    <input type="hidden" name="<?php echo session_name() ?> value=<?php echo session_id() ?>>

    再次访问是,我就可以使用诸如http://php.com/session.php?PHPSESSID=p7iqqncndjmf13si9r6bafg1h1的URL,这样就可以获取session了,但这是很不安全的,极力不推荐.因为url被窃取就完蛋了.

    使用这个配置项有个前提,就是session.use_only_cookies = 0

    注释1

    即session_set_save_handler()中指定的处理器的参数,处理器的一种方法按手册是这样设置

    session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] ),

    其中的第一个方法open(string $savePath, string $sessionName),$savepath就是根据session.save_path的值来获得的

    以上绝大部分都是摘自手册,大家可以去看手册,更详细,尤其是会话安全方面,更要注意.

  • 相关阅读:
    spring
    Hibernate中一级缓存和二级缓存使用详解
    myeclipse 配置weblogic
    小程序animation动画效果综合应用案例(交流QQ群:604788754)
    PHP:第二章——PHP中的equire与incude语句
    PHP:第二章——PHP中的break一continue一return语句
    PHP:第二章——PHP中的for语句
    PHP:第二章——PHP中的while语句
    PHP:第二章——PHP中的流程控制语句
    小程序animation动画效果(小程序组件案例)
  • 原文地址:https://www.cnblogs.com/ch459742906/p/6078770.html
Copyright © 2011-2022 走看看