session 的工作机制:
为每个访问者创建一个唯一的 id (uid),并基于这个 uid 来存储变量。uid 存储在 cookie 中,亦或通过 url 进行传导。
phpsessionid的生产算法原理:
1、hash_func = md5 / sha1 #可由php.ini配置
2、phpsessionid = hash_func(客户端ip + 当前时间(秒)+ 当前时间(微妙)+ php自带的随机数生产器)
从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的phpsessionid重复的概率极低。
另外,黑客如果要猜出某一用户的phpsessionid,则他也必须知道“客户端ip、当前时间(秒、微妙)、随机数”等数据方可模拟。
php.ini配置如下:
; select a hash function for use in generating session ids.; possible values; 0 (md5 128 bits); 1 (sha-1 160 bits); this option may also be set to the name of any hash function supported by; the hash extension. a list of available hashes is returned by the hash_algos(); function.; http://php.net/session.hash-functionsession.hash_function=0
php session工作原理
以下以cookie传输phpsessid描述。
1、客户端请求一个php的服务端地址。
2、服务端收到请求,此次php脚本中包含session_start()。
3、服务端会生成一个phpsessid。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_phpsessid,session文件存在session.save_path中。)
4、服务端响应首部response headers:set-cookie:phpsessid=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一个cookie保存此phpsessid。
5、此时,客户端的cookie里面包含了phpsessid,之后客户端的每次请求首部request headers:cookie:phpsessid=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个phpsessid来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。
如果客户端禁用了cookie,由于无法使用cookie传递phpsessid,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过phpsessid来重用session文件,所以session也就失效了。
这种情况可以设置session.use_trans_sid来传输phpsessid,具体实现方式与cookie的区别就是将phpsessid通过http的get传输。每次请求的地址里面都会补全phpsessid参数”url?phpsessid=37vjjasgjdv2ouk1uomhgqkv50”来实现。
phpcli模式通过session_id()使用session
可以通过它来获取当前会话的phpsessid,也可以通过它来设置当前的会话phpsessid。
phpcli模式下可以通过设置这个,达到使用session的目的,非常方便。
例如:
<?php// session_id('vingbrv8m64asth0nhplu9gmb7');session_start();$_session[md5(rand(100,999))] = rand(100,999);var_dump($_session);
推荐教程:php视频教程
学习专题:php session (包含图文、视频、案例)
以上就是php中session id的实现原理分析的详细内容。