在ThinkPHP 中测试禁用cookie,依然获取session值

首先找到php.ini文件,ctrl+F 查找 session.use_trans_sid 如果值是0,则不改,否则改为0

在ThinkPHP中的公共配置文件处 添加如下配置 'SESSION_AUTO_START' => false,//自动开启session关闭

众所周知,session文件保存在服务器端,cookie文件保存在浏览器端。

要获取session的值,其实是一个通过session_id的值去查找服务器端的session文件的过程。

当用户将数据保存在session中的时候,同时为这个文件生成了一个对应的session_id,默认情况下这个session_id是保存在cookie中的。

默认情况下,php.ini中的配置项 session.use_trans_sid = 0

①当手动关闭浏览器的cookie功能时,获取不到session值

public function session_cookie1 () {
    session_start();
    $_SESSION['uid'] = sha1('test');    
    $this->display();
}
public function session_cookie2 () {
    session_start();  
    echo $_SESSION['uid'];      
    $this->display();
}


从上面可以看到,没有输出 echo $_SESSION['uid'];

因为我们禁用了cookie;

我们看看没有禁用cookie时,这个session_cookie2.html页面输出的值

禁用cookie导致跨页面无法获取到session值

上面我们已经知道,要获取session值,那么我们就要获取到对应值得session_id

②所以我们可以使用get方式从url路径获取session_id;

 

我们给session_cookie1.html中的链接 “点击” 传递一个参数如图

这个是session_cookie1.html页面上链接传参情况

public function session_cookie1 () {
    session_start();
    $_SESSION['uid'] = sha1('test');
    $this->sessId = session_id();//对应的session_id并且传递到模板
    $this->display();
}
public function session_cookie2 () {
    session_id($_GET['sessId']);//关键是通过$_GET['sessId']传递的参数获取得到了session_id();
    session_start();
    echo $_SESSION['uid'];
    $this->display();
}

所以,接下来,我们看到session_cookie2.html页面有输出session值

我们可以看到,虽然那浏览器拒绝了cookie,但是因为通过URL地址栏依然传递了session_id值,所以跨页面依然得到了对应session值

③所以既然session_id可以通过url传递,那么自然我们也可以构造到表单中的post方法中,此处略

④手动修改php.ini配置项

   session.use_trans_sid = 1

       而大多数我们没机会能修改这个配置文件,所以不推荐

⑤保存session_id()到文件

 

总结:

  上面的方法有一个共同点,就是在前一页取得Session ID,然后想办法传递到下一页,在下一页的session_start();代码之前加代码Session ID(传过来的Session ID)。

 

  

 

posted @ 2014-08-20 13:17  Zell~Dincht  阅读(818)  评论(0编辑  收藏  举报