关于SESSION禁用COOKIE后能否使用的说法

http://bbs.phpchina.com/viewthread.php?tid=190302&extra=&page=1

php中session和cookie的话题争论过N遍了
首先还是要先说明一下session和cookie之间的一些特性:
session是保存在服务器端的,但sessionid是保存在客户端的。客户端禁用了cookie,session将不可用。
session需要借助cookie才能正常工作。尔cookie不需要依赖session,就可以独立工作。如果客户端完全禁止cookie,session将失效,
cookie是完全保存在客户端的, 客户端禁用了cookie,cookie将不可用。这点大家应该都没有疑问。
这两个都可以用来做会话,不同的是功能各异,
session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。
session和cookie都有有效期的说法
session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过期与否可以在cookie生成的时候设置进去。 当然cookie 也可以设置成关闭浏览器既消失.但你cookie设置的有效期再长,客户端的用户只要一删除本址cookie,你的cookie立马完玩。
不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K。

一个web站点向客户端发送的cookie不得超过20个,

一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB
二者的一些特性现在说完了,现在主要说说上面提到的如果禁用了cookie,为什么 session不能正常工作,
我发现很多人包括我以前一直以为session和cookie是独立工作的,二者互不干扰,就最近我以发现session必须得依赖cookie才能正常工作。很困惑吧,session不是保存在服务器端的吗,为什么禁用了cookie就不能工作了,答案是这样的:

所谓的session保存在服务器端是没错,但是http是无状态的协议也就是说,但浏览器解析完一个网页后,客户端为立即断开和服务器之间的联系,那么 session是凭什么知道这个会话是这个客户端的呢,这就要用到cookie了,session在开启的时候会生成一个独立的sessionid,这个 sessionid是通过cookie保存在客户端的,每当客户端刷新网页,浏览器都会把这个id发给服务器端,服务器再根据这个id来找到在服务器上保 存的session 信息从而识别用户,说白了,就是每次用session会话,session的内容是在服务器端保存,而他会给客户端一把用来访问这些信息的钥匙,而这个钥 匙就是sessionid,
所以说当浏览器禁用了cookie, session就不能工作了,因为客户端得不到这个钥匙,他就没法去开启服务器端保存的session这个大门。

php.ini中的session配置说明

下面介绍能让session运行的必要配置步骤

手动配置PHP运行环境时,最容易遗忘的一项是服务器端session文件的存储目录配置工作,打开php.ini文件,搜索Session,找到 session.save_path,默认值为/tmp,代表session文件保存在c:/tmp目录下,默认tmp目录并没有创建,你可以在c盘下创 建tmp目录,或者创建一个其他目录,比如leapsoulcn,再修改session.save_path的值,并去掉;,即

session.save_path = '/leapsoulcn’;

注意事项:

1、一般为了保证服务器的安全,session.save_path值最好设置为外网无法访问的目录,另外如果你是在linux服务器下进行session配置,请务必同时配置此目录为可读写权限,否则在执行session操作时会报错。

2、在使用session变量时,为了保证服务器的安全性,最好将register_globals设置为off,以保证全局变量不混淆,在使用 session_register()注册session变量时,你可以通过系统全局变量$_SESSION来访问,比如你注册了leapsoulcn变 量,你可以通过$_SESSION['leapsoulcn']来访问此变量。PHP环境变量$_SERVER和系统常量详细说明

session.save_path配置其他说明事项,从php.ini配置文件翻译而来

你可以使用”N;[MODE;]/path”这样模式定义该路径,N是一个整数,表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。

[MODE;]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。[MODE;]并不会改写进程的umask。 php不会自动创建这些文件夹结构。可使用ext/session目录下的mod_files.sh脚本创建。如果该文件夹可以被不安全的用户访问(比如 默认的”/tmp”),那么将会带来安全漏洞。当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。

如果你服务器上有多个虚拟主机,建议针对每个不同的虚拟主机分别设置各自不同的目录。

至此最基本的session配置就完成了,你只要保存php.ini,并重启apache,即可使用session功能。

其他session配置说明

session.save_handler = ”files”

默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。

session.use_cookies = 1

是否使用cookies在客户端保存会话sessionid,默认为采用cookies

session.use_only_cookies = 0

是否仅仅使用cookie在客户端保存会话sessionid,这个选项可以使管理员禁止用户通过URL来传递id,默认为0,如果禁用的话,客户端如果禁用Cookie将使session无法工作。

session.name = “PHPSESSID”

当做cookie name来使用的session标识名

session.auto_start = 0

是否自动启动session,默认不启动,我们知道在使用session功能时,我们基本上在每个php脚本头部都会通过 session_start()函数来启动session,如果你启动这个选项,则在每个脚本头部都会自动启动session,不需要每个脚本头部都以 session_start()函数启动session,推荐关闭这个选项,采用默认值。

session.cookie_lifetime = 0

传递sessionid的Cookie有效期(秒),0表示仅在浏览器打开期间有效。

session.gc_probability = 1

session.gc_divisor = 100

定义在每次初始化会话时,启动垃圾回收程序的概率。计算公式如 下:session.gc_probability/session.gc_divisor,比如1/100,表示有1%的概率启动启动垃圾回收程序,对 会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。

session.gc_maxlifetime = 1440

设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于 FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime 不同,将以所有session.gc_maxlifetime指令中的最小值为准。

分享