【php】PHP中Session ID的实现原理
<p>Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。</p><p>PHPSESSIONID的生产算法原理如下:</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>hash_func = md5 / sha1 #可由php.ini配置</strong></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)</strong></span></p>
<p>从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低(至少为百万份之一),设想,但台动态Web Server能到2000/rps已经很强悍了。<br><br>另外,黑客如果要猜出某一用户的PHPSESSIONID,则他也必须知道“客户端IP、当前时间(秒、微妙)、随机数”等数据方可模拟。<br><br>php.ini配置如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)"> Select a hash function for use in generating session ids.</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> Possible Values</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> 0(MD5 128 bits)</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> 1(SHA-1 160 bits)</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> This option may also be set to the name of any hash function supported by</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> the hash extension. A list of available hashes is returned by the hash_algos()</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> function.</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)"> http://php.net/session.hash-function</span>
session.hash_function=0</pre>
</div>
<p>【PHP session工作原理】</p>
<p style="text-align: left">以下以cookie传输PHPSESSID描述。</p>
<p style="text-align: left"><br>1. 客户端请求一个php的服务端地址。 </p>
<p style="text-align: left">2. 服务端收到请求,此次php脚本中包含session_start()。 </p>
<p style="text-align: left">3. 服务端会生成一个PHPSESSID。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。) </p>
<p style="text-align: left">4. 服务端响应首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一个cookie保存此PHPSESSID。 </p>
<p style="text-align: left">5. 此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个</p>
<p style="text-align: left">PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。</p>
<p style="text-align: left">如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。 </p>
<p style="text-align: left">这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?</p>
<p style="text-align: left">PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”来实现。</p>
<p style="text-align: left">【PHPcli模式通过session_id()使用session】</p>
<p>可以通过它来获取当前会话的PHPSESSID,也可以通过它来设置当前的会话PHPSESSID。</p>
<p>PHPcli模式下可以通过设置这个,达到使用session的目的,非常方便。</p>
<p>例如:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> session_id('vingbrv8m64asth0nhplu9gmb7');</span>
<span style="color: rgba(0, 128, 128, 1)">session_start</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(128, 0, 128, 1)">$_SESSION</span>[<span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(0, 128, 128, 1)">rand</span>(100,999))] = <span style="color: rgba(0, 128, 128, 1)">rand</span>(100,999<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$_SESSION</span>);</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/opensmarty/p/11078439.html
頁:
[1]