澳门新葡萄京官网注册 1

PHP Session机制简介及用法

近日在为学校制做校友录时,需要身份验证,在对比之后决定采用PHP+MYSQL进行身份验证。

当服务器创建了一个session(session_start()),服务器将会在服务器的指定文件夹下创建一个session文件,其名称为sessionID,并当做cookie的值发送给浏览器。浏览器每次访问该服务器时便会带着这个cookie,服务器便会识别改sessionID,找到相应的session文件。该文件中存放了若干键值对。该session文件所存放的文件夹可以在配置文件php,ini中修改。

什么是 Cookie?

cookie 常用于识别用户。cookie
是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送
cookie。通过 PHP,能够创建并取回 cookie 的值。

一、关于创建cookie

setcookie(name, value, expire, path, domain);

例子:

下面的例子会设置一个cookie键值对,过期时间为1小时,服务器会将该cookie发送到客户端。(在发送
cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码)

<?php 
setcookie("user", "Alex Porter", time()+3600);
?>

<html>
<body>

</body>
</html>

二、服务器端如何取回cookie

PHP 的 $_COOKIE 超全局变量用于取回 cookie 的值。

在下面的例子中,我们取回了名为 “user” 的 cookie
的值,并把它显示在了页面上:

<?php
// Print a cookie
echo $_COOKIE["user"];

// A way to view all cookies
print_r($_COOKIE);
?>

在下面的例子中,我们使用 isset() 函数来确认是否已设置了 cookie: 

<html>
<body>

<?php
if (isset($_COOKIE["user"]))
  //确认是登录态,继续操作
else
  //重定向到登录界面
?>

</body>
</html>

由于使用了setcookie()设置cookie信息,浏览器端以后每次向该域内的php脚本发送请求时,都会自动在请求头上加上cookie字段。上面这种方法可用于防止用户绕过登录界面,直接访问内部页面。(因此setcookie()一般应该在登录界面验证成功后使用),有了cookie验证之后,才可以维护已登录用户的状态。

 

三、如何删除cookie

当删除 cookie 时,您应当使过期日期变更为过去的时间点。

删除的例子:

<?php 
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>

四、cookie总结

Cookie在项目实战中都有哪些应用:

1>记住用户名密码

澳门新葡萄京官网注册 ,2>在cookie的生命周期之内,维护用户的登录状态

 

Cookie的优缺点

1>优点:a.不需要服务器资源空间 b.持久时间更长

2>缺点:a.客户端大小受限制 b.用户禁用Cookie那么就废用了 c.不安全

(6)Cookie和Session的区别和联系

1>联系:Cookie可以在客户端为session保存唯一标识(sessionID)

2>区别:Cookie机制采用的是在客户端(浏览器)保持状态的方案,而session机制采用的是在服务器端保持状态的方案

 

 

之前也曾考虑过用cookies或session。但是用cookies,在用户离线再上线后,只要cookies不过期,不用登录仍然可以保持在线,这对于网吧来说是个隐患。而且用户可以关闭cookies,这样身份验证就不成功。也考虑过用session,session在浏览过程中不断的将访问信息加入到session中,如果用户在网站内时间很长,浏览的页面很多,就用导致session越来越大,浏览速度降低,最后只有重新登录,

澳门新葡萄京官网注册 1

关于session

一、session 变量

当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于
HTTP 地址不能维持状态。

通过在服务器上存储用户信息以便随后使用,PHP session
解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。

Session 的工作机制是:为每个访问者创建一个唯一的 id
(sessionID),并基于这个 sessionID 来存储变量。sessionID 存储在 cookie
中,亦或通过 URL 进行传导。

 

二、开始启动会话

<?php session_start(); ?>

<html>
<body>

</body>
</html>

session_start()做了哪些初始化工作?

上面的代码首先会尝试在服务器端读取客户端发来的请求报文中名为sessionID的cookie值。若没有读取到,说明用户首次登录,会向服务器注册用户的会话,同时会为用户会话分配一个
sessionID。并且将名为sessionID的cookie发送给客户端。 

关于sessionID的产生:

PHP在使用默认的 session.save_handler = files
方式时,PHPSESSIONID的生产算法原理如下:

hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+
PHP自带的随机数生产器)

从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低(至少为百万份之一)

如何获取sessionID的值?

session_id() 可以用来获取/设置 当前会话
ID。类似cookie机制,我们也可以通过检查sessionID的值是否存在,来验证用户是否是已登录状态。

<?php
  session_start();
  echo session_id();
  // 输出 08nr1fav9jqs2pdi5qlpsmd247
?>

三、存储session变量

存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>

<html>
<body>

<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>

</body>
</html>

 

四、销毁session

unset() 函数用于释放指定的 session 变量:

<?php
unset($_SESSION['views']);
?>

也可以通过 session_destroy() 函数彻底终结
session: (session_destroy() 将重置 session,您将失去所有已存储的
session 数据。)

<?php
session_destroy();
?>

 

五、session总结

Session项目实战中都有哪些应用:

1>记录用户登陆信息,全局使用

2>制作验证码,验证对比操作

3>将session保存到数据库可以实现:a.控制一个帐号只能一个人登录

 

Session的优缺点:

1>session的优点:唯一性、方便调用、不会过多占用资源,是存储在服务器的一组临时数据。一般情况下,我们在做用户登录时,会将用户数据存入session。这样,在任何页面都可以方便调用,而且
每个客户端会产生唯一的session_id,不会混肴。并且在关闭浏览器后,服务器会有session回收机制,自动删除过期session

2>缺点:在客户端是以cookie方式保存的,禁用cookie就没用了。

 

Session和Cookie的联系以及区别:

1>联系:Session在客户端也需要保存一个标识,所以就要借助Cookie,session是通过cookie来工作的session和cookie之间是通过$_COOKIE[‘PHPSESSID’]来联系的,通过$_COOKIE[‘PHPSESSID’]可以知道session的id,从而获取到其他的信息。

2>区别:Cookie机制采用的是在客户端(浏览器)保持状态的方案,而session机制采用的是在服务器端保持状态的方案

虽然这种情况不多见,但不是我们所希望的。

cookie
每次请求页面的时候进行验证,如果用户信息存储在数据库中,每次都要执行一次数据库查询,给数据库造成多余的负担。cookie可以被修改的,所以安全系数太低。

我在做这个身份验证时的想法是,在身份验证的同时,记录浏览信息。

session是存储在服务器端面的会话,相对安全,并且不像Cookie那样有存储长度限制。由于Session是以文本文件形式存储在服务器端的,所以不怕客户端修改Session内容。实际上在服务器端的Session文件,PHP自动修改session文件的权限,只保留了系统读和写权限,而且不能通过ftp修改,所以安全得多。

用户ID在每个页面间传递,ID值是用MD5()函数加密得到的。验证函数是validate_id(),返回值为(0,1),成功为1。

对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie
中保存用户名和密码(可能是 md5
加密后字符串),并在每次请求页面的时候进行验证。

思路:

如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能
只做一次验证。为什么呢?

判断被传入的ID值是否为匿名登录ID(a684dd572b1887661782981659331eed),32位,如果是返回0,并且将浏览信息加入数据库。如果否,则查询数据库,看数据库中的用户ID,用户IP与传入的ID,IP值是否相等并且最近浏览时间距当前时间不到20分钟的记录。

因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin
变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false
的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在
Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的
$admin 变量那不是就立即取的了管理权限么?非常的不安全。

判断得到的记录数,如果为0,则认为离线,并用匿名ID登录浏览信息,返回0。记录不为0时,将用户ID,用户IP值,加入数据库,返回1。

而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改
Session 文件的内容,因此我们可以单纯存储一个 $admin
变量来判断是否登陆,首次验证通过后设置 $admin 值为
true,以后判断该值是否为
true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。

创建数据库:

而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session
验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了
md5 加密,也是很容易被截获的。

createtablelogging{idintunsignednotnullprimarykeyauto_increment,user_idchar(32)notnull,//用户IDlogging_ipvarchar(20)notnull,//记录用户IP地址page_namevarchar(30)notnull,//浏览网页名view_timetimestampnotnull,student_idvarchar(20));创建函数:/*-----beginfunctionvalidate-id()---------------验证用户是否登录------------------------------------------------*/functionvalidate_id($link,$id,$ip,$page_name,$student_id=){if($id==a684dd572b1887661782981659331eedor$id=){$query=insertintologging(user_id,logging_ip,page_name,student_id)values(a684dd572b1887661782981659331eed,.$ip.,.$page_name.,anonym);;$result=mysql_db_query(web,$query,$link);return(0);}else{$year=strftime(%Y);$month=strftime(%m);$day=strftime(%d);$hour=strftime(%H);$min=strftime(%M);$sec=strftime(%S);echo$time_string=$year.$month.$day.$hour.$min.$sec;//echo(br);//echo$year-$month-$day$hour-$min-$secbr;//---------beginifs---------------------------if(($min-=20)0){$min+=60;if(($hour-=1)==-1){$hour+=24;if(($day-=1)==0){switch($month){case12:$days=30;break;case1:$days=31;break;case2:if(($year/4==0)and($year/100!=0)or($year/400==0)){$days=29;}else{$days=28;}break;case3:$days=31;break;case4:$days=30;break;case5:$days=31;break;case6:$days=30;break;case7:$days=31;break;case8:$days=31;break;case9:$days=30;break;case10:$days=31;break;case11:$days=30;break;}$day+=$days;if(($month-=1)==0){$month+=12;$year-=1;}}}}//----------------------------------endifssetType($month,integer);if($month10){setType($month,string);$month=0.$month;}setType($day,integer);if($day10){setType($day,string);$day=0.$day;}setType($hour,integer);if($hour10){setType($min,string);$hour=0.$hour;}setType($min,integer);if($min10){setType($min,string);$min=0.$min;}echobr.$time_string=$year.$month.$day.$hour.$min.$sec;//echobr$year-$month-$day$hour-$min-$secbr;//echo(br);$query=selectidfromloggingwhereuser_id=$idandlogging_ip=$ipandview_time$time_string;;$result=mysql_db_query(web,$query,$link);$count=mysql_num_rows($result);if($count==0){//echo$query=insertintologging(user_id,logging_ip,page_name)values(a684dd572b1887661782981659331eed,$ip,$page_name);;$result=mysql_db_query(web,$query,$link);return(0);}else{$query=insertintologging(user_id,logging_ip,page_name)values($id,$ip,$page_name);$result=mysql_db_query(web,$query,$link);return(1);}}//endif}//----------------------------endfunctionvalidate-id---------

session 会话会为每一个开启了 session 会话的访问者建立一个唯一的会话 ID
,用于识别用户。该会话 ID 可能存储于用户电脑的 cookie 内,也可能通过 URL
来传递。而对应的具体 session 值会存储于服务器端,这也是与 cookie
的主要区别,并且安全性相对较高。

这个验证方法很简单,而且没有考虑到用户在登录后再登录的情况,大家可以自己加上。

创建 session

如果用cookies,可能用setcookies()建立用户ID,再从环境变量$HTTP_COOKIE或$HTTP_COOKIE_VARS中读取。都是一样的,不过应该保证用户没有cookies。

要创建 session 或返回已经存在的会话 ,就必须先使用 session_start()
函数开启一个 session 会话,系统会分配一个会话 ID:

注册session变量

使用 session_register() 函数注册一个 session 变量,成功返回 TRUE
,否则返回 FALSE 。

语法:bool session_register( mixed name [, mixed …] )

使用 session_register() 函数可以在目前会话下注册一个或多个全局 session
变量。
参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

例子:

在该例子中,我们向 session 注册了一个名为 username 的变量,其值为 nostop

读取 session

PHP 内置的 $_SESSION 变量可以很方便的访问设置的 session 变量。

例子:

销毁 session

session_unregister()  注销单个 session 变量
unset($_SESSION[‘age’]);
用于注销以$_SESSION[‘age’]注册的session变量
session_unset()  删除所有已注册的变量
session_destroy() 注销所有的session变量,并注销整个 session 会话

例子:

检查变量是否被登记为会话变量

session_is_registered

语法:boobean session_is_registered(string name);

这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。

例子:

存取当前会话名称

session_name

语法:boolean session_name(string [name]);

这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name。

例子:

存取当前会话标识号

session_id

语法:boolean session_id(string [id]);

这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id。

设置 Session 的生存期

setcookie:向客户端发送一个 HTTP cookie。

session_set_cookie_params:设置 Session 的生存期的,该函数必须在
session_start() 函数调用之前调用。
如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie
会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。

// 保存一天

设置 Session 文件的保存路径

session_save_path() :必须在 session_start() 函数调用之前调用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注