PHP Session ID的实现原理与实例

作者:php007 时间:2023-07-13 13:36:53 

Session作用

Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:
1、判断用户是否登录。
2、购物车功能。

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配置如下:


; http://php.net/session.hash-function
session.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传输。

session.use_cookies = 0  //设置客户端是否使用cookie来保存session值  该参数的值不影响上述机制的进行。

但是为了验证该机制,这里把该参数设为0,排除cookie携带seesionid的可能

session.use_only_cookies = 0  //是否只使用cookie来保存session值  该参数为1时,上述机制失效。

设置session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid每次请求的地址里面都会补全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);

Session实例问题

 现有系统A,B; 假设A系统是可以独立运行的web系统,即可以和浏览器直接处理session, B系统是基于mobile的,需要调用A系统的功能接口,

在保持A不改变的情况下,即登陆验证,session存储都不变的情况下,B系统能处理前端用户的请求。

这里提供的方案是使用PHP实现

在用户登陆成功后,将保存的session的session-id返回给B系统,然后B系统每次请求其他接口都带session_id。

A系统在session_start前加上session_id(session_id);

这样B系统就能安全的调用A

session安全问题

       再聊下session_id吧,它是保存在cookie中,首先session是一个只要活动就不会过期的东西,只要开启cookie,每一次会话,session_id都不会改变,我们可以根据session_id来判断用户是否是正常登陆,防止用户伪造session。然后我们也要防止session被劫持,我们可以对session_id进行再一次的加密,防止暴力破解,还有可以设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。

来源:https://cloud.tencent.com/developer/article/1677270

标签:PHP,Session,ID
0
投稿

猜你喜欢

  • 如何把一个Excel文件放到ASP页面中去?

    2009-11-07 17:54:00
  • Python远程控制Windows服务器的方法详解

    2023-07-13 13:14:03
  • java正则表达式匹配所有数字的案例

    2023-07-07 02:59:38
  • ASP基础教程:常用的 ASP ActiveX 组件

    2008-10-14 15:15:00
  • delete from 表名与truncate table 表名区别

    2012-11-30 20:31:37
  • python切换hosts文件代码示例

    2023-07-19 15:41:43
  • pytorch 模型可视化的例子

    2023-06-13 08:24:34
  • 一个jquery日期选取插件源码

    2009-12-23 19:15:00
  • 修复 jQuery 中 isFunction 方法的 BUG

    2010-01-25 12:05:00
  • 如何创建一个对索引服务器进行查询的ASP页面?

    2009-11-14 20:54:00
  • 从 msxml6.dll 中获取 DOMDocument 对象的方法与属性

    2009-02-22 18:46:00
  • Google Chrome CSS选择器速度测试比较

    2008-10-06 13:24:00
  • 可以随便改别人的网页的代码

    2008-03-25 12:54:00
  • 懒懒交流会:ClassName的长命名 VS. 短命名

    2009-11-28 16:08:00
  • 品牌的统一体验

    2010-05-19 13:08:00
  • Data URI 和 MHTML

    2009-08-16 16:19:00
  • removeChild的障眼法

    2009-12-04 12:49:00
  • 如何得到数据库中所有表名 表字段及字段中文描述

    2012-01-05 18:56:44
  • 将SQL Server中所有表的列信息显示出来

    2009-01-08 16:27:00
  • 课程讲解 如何使用SQL Server校勘功能

    2009-01-13 13:27:00
  • asp之家 网络编程 m.aspxhome.com