type
Post
status
Published
date
Oct 20, 2016
slug
php-session-bug
summary
和朋友写一个 php 项目, 发现当设置的 session_name 包含 . 的时候,用户的登录状态无法保存了.具体是什么原因导致的呢?
tags
PHP
Session
category
技术分享
icon
password
Property
Jan 1, 2023 02:48 PM

在 php 的官方文档中,关于session_name设置的问题有如下的描述:
会话名称至少需要一个字母,不能全部都使用数字, 否则,每次都会生成一个新的会话 ID
这个似乎和我们的问题没什么关系,而下面有一条这样的描述:
if you try to name a php session “example.com” it gets converted to “example_com” and everything breaks.
他告诉我们session_name如果有.的话,他会将他转换成_,具体的过程却没有细说.所以我们还需要亲自动手.
首先我们设置session_nameuser.test,然后输出session_id,代码如下:
session_name('user.test'); session_start(); echo session_id();
不停的刷新页面的话,你会发下你每次输出的session_id是不同的.
打开 chrome 的开发者工具,查看本地的cookie的话,你会发现这样子:
notion image
cookie中保存的session_name依然是user.test!那么到底是哪里出问题了呢?我们继续找:
session_name('user.test'); session_start(); print_r($_COOKIE); echo session_id();
打印出来的结构如图:
notion image
问题出现在这里, php 在读取浏览器传过来的cookie中的session_name时,将session_name中的.转换成了_,具体流程如图:
notion image
至于为什么读取COOKIE的时候会将. _呢,这就需要我们慢慢研究了.
 
2016年年终总结从零开始写一个 PHP 框架

杂鱼
杂鱼
菜鸟程序员