在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)。
----“做每天该做的事,不计结果!”
---- 因爲對於編程還只是新手,對很多知識掌握的不牢靠,歡迎大家批評指正~~|=-=|~~