php通过会话控制实现身份验证实例


Posted in PHP onOctober 18, 2016

会话控制的思想就是指能够在网站中根据一个会话跟踪用户。这里整理了详细的代码,有需要的小伙伴可以参考下。

概述

http 协议是无状态的,对于每个请求,服务端无法区分用户。PHP 会话控制就是给了用户一把钥匙(一个加密session字符串),同时这也是用户身份的一个证明,服务端存放了这把钥匙能打开的箱子(数据库,内存数据库或者使用文件做的),箱子里面装的就是用户的各个变量信息。

传统的php session 使用

<?php
//page1.php 启动一个会话并注册一个变量
session_start();
$_SESSION['user_var'] = "hello,codekissyoung!";
//这里的可以将$_SESSION理解为用户的箱子,实际的实现是php在服务器端生成的小文件
?>
<?php
//page2.php
session_start();
echo $_SESSION['user_var'];//通过钥匙访问自己的箱子内的变量
$_SESSION['user_var'] = "bey,codekissyoung!";
?>
<?php
//page3.php 销毁钥匙,一般在用户注销时,访问page3.php文件
session_start();
session_destroy();
?>

提一个问题,钥匙呢?没看见给用户钥匙的操作啊?

这个操作是php背后帮我们做了的,自从你访问page1.php 程序运行,session_start();这句时,php 会根据此刻的一些条件(用户ip,浏览器号,时间等)生成一个PHPSESSID变量,http response 回客户端后,这个PHPSESSID就已经存在你的浏览器cookie里了,每次你再次访问这个域名时,该PHPSESSID都会发送到服务端。这个PHPSESSID 就是我这里说的用户钥匙了。

再一个问题,这个PHPSESSID的安全性,它是否容易被窃取,是否容易被伪造,是否容易被篡改?

使用 Https 可以防止被篡改。不使用PHPSESSID,而是自己生成一把秘钥给用户可以防止被伪造。至于是否容易被窃取,还真没怎么研究过。比如如果你电脑连着网,黑客入侵你电脑。

将生成的秘钥存入浏览器cookie中

  • 设置cookie
  • setCookie('key','value',time()+3600);
  • 删除cookie
  • setCookie('key','',time()-1);

实现单点登录:session共享

单点登录:多个子系统之间共用一套用户验证体系,在其中一处登录,就可以访问所有子系统。

试想这么一种情景:假设服务器A与B的php环境一致。用户在 服务器A 上拿到了自己的钥匙,然后他拿着这把钥匙去访问服务器B,请问服务器B认识么?

很显然不能,服务器A生成的钥匙,服务器并不认识。

解决办法:用户无论访问A或B,生成的钥匙我都存储在C(同一个数据库,或缓存系统)中,用户再次访问A或B时,A和B都去问下C:这个用户的钥匙对么?对的话,用户就可以使用自己存在A或者B那里的箱子了。

<?php
session_regenerate_id();//重置 session  字符
$session_info=array('uid'=>$uid,'session'=>session_encrypt(session_id().time()));
//下一步将,$session_info 存到 C 中
?>

下面是php通过会话控制实现身份验证实例

身份验证应用程序主体:authmain.PHP

<?php 
//开启一个会话 
session_start(); 
 
if((!isset($userid))||(!isset($password))) { 
  $userid=$_POST['userid']; 
  $password=$_POST['password']; 
//连接数据库 
$db_conn=new mysqli("localhost", "root", "","auth"); 
if(mysqli_connect_errno()){ 
  echo '连接数据库失败:'.mysqli_connect_error(); 
  exit(); 
} 
//执行SQL查询语句 
$query="SELECT * FROM authorized_users WHERE name='".$userid."' and password=sha1('".$password."')"; 
$result=$db_conn->query($query); 
if($result->num_rows>0){ 
  //注册一个会话变量 
  $_SESSION['valid_user']=$userid; 
} 
//断开数据库连接 
$db_conn->close(); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
  <meta charset="UTF-8"> 
  <title>身份验证</title> 
</head> 
<body> 
<h1>主页</h1> 
<?php 
//判断用户是否已经登录 
if(isset($_SESSION['valid_user'])){ 
  echo $_SESSION['valid_user'].',您好,你已经登录'; 
  echo '<a href="logout.php">退出登录</a><br/>'; 
}else{ 
  if(isset($userid)){ 
    echo '您没有登录成功'; 
  }else{ 
    echo '您还没有登录<br/>'; 
  } 
  ?> 
  <form method="post" action="authmain.php"> 
    <p>用户名:<input type="text" name="userid"></p> 
 
    <p>密码:<input type="password" name="password"></p> 
 
    <p><input type="submit" name="submit" value="登录"></p> 
  </form> 
<?php 
} 
?> 
<br/> 
<a href="members_only.php">登录进入</a> 
 
</body> 
</html>

网站的有效用户检查:members_only.php

<!DOCTYPE html> 
<html> 
<head> 
  <meta charset="UTF-8"> 
  <title>身份验证</title> 
</head> 
<body> 
<?php 
//启用会话 
session_start(); 
 
echo '<h1>会员有效</h1>'; 
if(isset($_SESSION['valid_user'])){ 
  echo "<p>".$_SESSION['valid_user'].",您好,您已经登录成功</p>"; 
  echo '<p>会员可享受折扣优惠</p>'; 
}else{ 
  echo '<p>您还没有登录成功</p>'; 
  echo '<p>只有登录成功才能查看此页</p>'; 
} 
echo '<a href="authmain.php">返回主页</a>'; 
?> 
</body> 
</html>

注销会话变量并销毁会话:logout.php

<?php 
//启用会话 
session_start(); 
$olduser=$_SESSION['valid_user']; 
//注销会话变量 
unset($_SESSION['valid_user']); 
//销毁会话 
session_destroy(); 
?> 
<!DOCTYPE html> 
<html> 
<head> 
  <meta charset="UTF-8"> 
  <title>退出登录</title> 
</head> 
<body> 
<h1>您退出登录了!</h1> 
<?php 
if(!empty($olduser)){ 
  echo '退出登录了<br/>'; 
}else{ 
  echo '您没有登录过,所以当然也不存在退出登录<br/>'; 
} 
?> 
<a href="authmain.php">返回主页</a> 
</body> 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php学习 字符串课件
Jun 15 PHP
php 多个submit提交表单 处理方法
Jul 07 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 PHP
利用php_imagick实现复古效果的方法
Oct 18 #PHP
php封装的page分页类完整实例
Oct 18 #PHP
php封装的单文件(图片)上传类完整实例
Oct 18 #PHP
Thinkphp实现短信验证注册功能
Oct 18 #PHP
php基于单例模式封装mysql类完整实例
Oct 18 #PHP
php封装的mysqli类完整实例
Oct 18 #PHP
PHP实现文件上传下载实例
Oct 18 #PHP
You might like
基于mysql的论坛(4)
2006/10/09 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
详解jQuery中的事件
2016/12/14 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
three.js 入门案例详解
2018/01/23 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
2015年教学工作总结
2015/04/02 职场文书
2015年派出所工作总结
2015/04/24 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS