php中的session_id详解

<p>php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID。为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格...</p><p>php中session_id()函数原型及说明</p><p>session_id() 可以用来获取/设置 当前会话 ID。</p><p>为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格式表达的会话名称和 ID。 请参考 会话处理。</p><p>session_id()函数参数:</p><p>id</p><p>如果指定了 id 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。 不同的会话管理器对于会话 ID 中可以使用的字符有不同的限制。 例如文件会话管理器仅允许会话 ID 中使用以下字符:a-z A-Z 0-9 , (逗号)和 - (减号)</p><p>Note: 如果使用 cookie 方式传送会话 ID,并且指定了 id 参数, 在调用 session_start() 之后都会向客户端发送新的cookie, 无论当前的会话 ID 和新指定的会话 ID 是否相同。<br/></p><p>session_id()函数返回值:<br/></p><p>session_id() 返回当前会话ID。 如果当前没有会话,则返回空字符串(&quot;&quot;)。<br/></p><p>php会话ID如何生成以及会话ID长度 </p><p> 一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 id. 这个 id 可以存储在用户端的一个 cookie 中,也可以通过 URL 进行传递. Session会话用来追踪每个用户的会话,使用服务器生成的SessionID进行标识,用以区分用户。Session存放在服务器的内存中,SessionID存放在服务器内存和客户机的Cookie里面。这样,当用户发出请求时,服务器将用户Cookie里面记录的SessionID和服务器内存中的SessionID进行比对,从而找到这个用户对应的Session进行操作。所以,如果客户机禁止Cookie的话,Session也不能使用。</p><p>php会话ID是如何产生的?PHP默认的session id生成算法介绍</p><p> 以php5.3.6的源码为例,进入/ext/session目录,生成session id的函数位于session.c文件的345行,c语言函数原型如下:</p><p>PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS);<br/></p><p> 有兴趣的可以具体分析实现原理。<br/></p><p>PHP默认的session id长度</p><p>截取一些实际的php 5.4.6服务端生成的session id如下:</p><p>sess_00nrqa20hjrlaiac0eu726i4q5    sess_89j9ifuqrbplk0rti2va2k1ha0     sess_g2rv1kd6ijsj6g6c9jq5mqglv5 </p><p>sess_04es72a83tqsl0jqd3cvrc4s01    sess_8b7a5lme60g49lvk4u4jiemdn1    sess_g3uk6d3gbashg5eoq0b2k7vsk0 </p><p>sess_04u0ns0oobh2g93t009bij2rq0   sess_8dfvkiv8ml44fdqrk1rcmjchs4    sess_g64tddhbo8pbj8bs7bel44rf35 </p><p>sess_0592dolr5m0k392fah6c9preg7   sess_8fhgkjuakhatbeg2fa14lo84q1    sess_g6kl828qqsnvdrse7ff52cl2a4 </p><p>sess_066g8irr0m22iqotscepub4e13    sess_8gn03i9j1tta7655qfj6nl1l53    sess_g8t45j6qce7mf55nk14cotj5i4 </p><p>sess_08nr1fav9jqs2pdi5qlpsmd247    sess_8gvu05313o7p9usksaacaiegu6   sess_gbtjmr57iat86c8ve86ar5nh30</p><p>可见具体的session id 为 &quot;sess_&quot;后面的部分,长度为26位,此长度仅限于php 5.4.6.</p><p>php session_id()用法代码举例如下:</p><p>输出session_id()详细代码:</p><pre class="brush:php;toolbar:false">&lt;?php session_start();//开启session会话 echosession_id();//输入session_id //输出08nr1fav9jqs2pdi5qlpsmd247 ?&gt;</pre><p>设置 session_id()详细代码:</p><pre class="brush:php;toolbar:false">&lt;?php session_id(&quot;www.169it.com&quot;);//设置session_id session_start();//开启session会话 echosession_id(); //输出www.169it.com ?&gt;</pre><p>总结:</p><p>php中的session_id函数恢复session的内容方法</p><p> php的session是可以程序恢复的,这个和java不太一样。session的恢复机制可以实现多个应用程序session的共享,因为php的session都是以文件形式或者数据库存储的。首先是session_id的获取是通过session_id()函数获取,这个值可以进行传递。程序恢复session,首先要知道session_id,大家通过手册可以知道session的恢复通过session_id($id);但是在恢复时要注意一个先后顺序,要得到之前session的内容,必须在session_start()之前执行session_id($id),这样才能在执行了session_start时初始化session的时候恢复到之前的内容,否则的话你得到的是一个空的session,你什么也得不到。之前session被重新初始化了。这个和session_start()的作用有密切关系,因为session_start告诉php,session要初始化,要从session文件中反序列化session内容,所以session_start的作用就是把之前存储的文件内容反序列化。session_start序列化之前要知道session_id,如果没有就生成一个新的session_id。如果有就反序列化相应文件的内容。</p><p>后续:</p><p>Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。</p><p>前序:</p><p>首先要明白PHPSESSID看似多次刷新都不会改变其实是没有删除本地相关联的cookie,删除的方法<br/></p><p>session_destroy();//删除服务器端的session文件</p><p>setcookie(session_name(),&#39;&#39;,time()-3600,&#39;/&#39;);//删除本地相关联的cookie</p><p>session_unset();//清空内存中的cookie或者是$_SESSION = array();</p><p>然后再刷新相应的页面你就会看到PHPSESSID会发生变化了,根据此可以得:如果session文件已经创建则不重新生成PHPSESSID,否则需要重新生成,生成规则,就看下边喽……!</p><p>--------------------------------------------------------------------------------------------------------------------------------------</p><p>现在经过测试应该是不是检测session文件是否存在,而是检测PHPSESSID的cookie是否存在并且是否未过期!特此更正!</p><p>------------------------------------------------------------------------------------------------</p><p>可能PHP开发者心中多少都思考过这么两个问题:</p><p>种植在客户端浏览器中的PHPSESSIONID会出现重复吗?</p><p>PHPSESSIONID安全性如何,有没可能被黑客轻易的仿造呢?</p><p>带上这个问题,我稍微注意了一下PHP的源码后,疑问也就有了答案。</p><p>PHP在使用默认的 session.save_handler = files 方式时,PHPSESSIONID的生产算法原理如下:</p><p>hash_func = md5 / sha1 #可由php.ini配置</p><p>PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)</p><p>从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低(至少为百万份之一),设想,但台动态Web Server能到2000/rps已经很强悍了。</p><p>另外,黑客如果要猜出某一用户的PHPSESSIONID,则他也必须知道&quot;客户端IP、当前时间(秒、微妙)、随机数&quot;等数据方可模拟。</p><p>以下是截取PHP源码中PHPSESSIONID实现片段:</p><pre class="brush:php;toolbar:false">gettimeofday(&amp;tv,NULL); if( zend_hash_find(&amp;EG(symbol_table),&quot;_SERVER&quot;,sizeof(&quot;_SERVER&quot;),(void**)&amp;array)==SUCCESS&amp;&amp; Z_TYPE_PP(array)==IS_ARRAY&amp;&amp;zend_hash_find(Z_ARRVAL_PP(array),&quot;REMOTE_ADDR&quot;,sizeof(&quot;REMOTE_ADDR&quot;),(void**)&amp;token)==SUCCESS) { remote_addr=Z_STRVAL_PP(token); } spprintf(&amp;buf,0,&quot;%.15s%ld%ld%0.8F&quot;,remote_addr?remote_addr:&quot;&quot;,tv.tv_sec,(longint)tv.tv_usec,php_combined_lcg(TSRMLS_C)*10); switch(PS(hash_func)) { casePS_HASH_FUNC_MD5: PHP_MD5Init(&amp;md5_context); PHP_MD5Update(&amp;md5_context,(unsignedchar*)buf, strlen(buf)); digest_len=16; break; casePS_HASH_FUNC_SHA1: PHP_SHA1Init(&amp;sha1_context); PHP_SHA1Update(&amp;sha1_context,(unsignedchar*)buf, strlen(buf)); digest_len=20; break; default: php_error_docref(NULLTSRMLS_CC,E_ERROR,&quot;Invalidsessionhashfunction&quot;); efree(buf); returnNULL; }</pre>
RangeTime:0.010638s
RangeMem:215.51 KB
返回顶部 留言