加入收藏 | 设为首页 | 会员中心 | 我要投稿 92站长网 (https://www.92zz.com.cn/)- 语音技术、视频终端、数据开发、人脸识别、智能机器人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php cookie记录登录信息的原理和实例

发布时间:2023-11-03 11:02:33 所属栏目:PHP教程 来源:网络
导读:   我大概是这样做的:



  (1)生成用户验证token



   用户登录后我会生成一个token,该token可能由如下信息组成:username+ip+expiration+salt【只是举例】,然后将组成
  我大概是这样做的:
 
  (1)生成用户验证token
 
      用户登录后我会生成一个token,该token可能由如下信息组成:username+ip+expiration+salt【只是举例】,然后将组成信息用可逆加密函数加密得到token,并将该token保存到数据库,写入cookie;
 
  (2)最后这样去校验信息,判断用户的登录状态
 
      将token解密,验证用户username,如果存在,继续;然后验证token是否和存入数据库的token相同,如果相同继续;验证cookie的有效期expiration,如果有效继续;验证ip是否变化,若变化跳入登录。。。。。。甚至还可以验证user agent.
 
  例子
 
  php session应用实例--登录验证:
 
   代码如下
 
  1
 
  2
 
  3 用户名:
 
  4 密码:
 
  5 Cookie保存时间:
 
  6
 
  7
 
  8 -------------------------------------------------------------------------------------------------------------------------
 
  9
 
  @mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
 
  or die("数据库服务器连接失败");
 
  @mysql_select_db("test")      //选择数据库mydb
 
  or die("数据库不存在或不可用");
 
  //获取用户输入
 
  $username = $_POST['username'];
 
  $passcode = $_POST['passcode'];
 
  //执行SQL语句获得Session的值
 
  $query = @mysql_query("select username, userflag from users "
 
  ."where username = '$username' and passcode = '$passcode'")
 
  or die("SQL语句执行失败");
 
  //判断用户是否存在,密码是否正确
 
  if($row = mysql_fetch_array($query))
 
  {
 
  session_start();        //标志Session的开始
 
  //判断用户的权限信息是否有效,如果为1或0则说明有效
 
  if($row['userflag'] == 1 or $row['userflag'] == 0)
 
  {
 
  $_SESSION['username'] = $row['username'];
 
  $_SESSION['userflag'] = $row['userflag'];
 
  echo "欢迎登录,点击此处进入欢迎界面";
 
  }
 
  else          //如果权限信息无效输出错误信息
 
  {
 
  echo "用户权限信息不正确";
 
  }
 
  }
 
  else           //如果用户名和密码不正确,则输出错误
 
  {
 
  echo "用户名或密码错误";
 
  }
 
  ?>
 
  10 -------------------------------------------------------------------------------------------------------------------------
 
  11
 
  12 session_start();
 
  unset($_SESSION['username']);
 
  unset($_SESSION['passcode']);
 
  unset($_SESSION['userflag']);
 
  13 // 最后彻底销毁session.
 
           session_destroy();
 
  14 echo "注销成功";
 
  ?>
 
  15          
 
           // 初始化session.
 
           session_start();
 
           /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/
 
           $_SESSION = array();
 
           /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
 
           if (isset($_COOKIE[session_name()])) {
 
                 setcookie(session_name(), '', time()-42000, '/');
 
            }
 
           // 最后彻底销毁session.
 
           session_destroy();
 
           ?>
 
  16 由此我们可以得出删除Session的步骤:
 
  ①session_start()
 
  ②$_SESSION=array()/unset($_SESSION['xxx'])
 
  ③session_destroy()
 
  17 -------------------------------------------------------------------------------------------------------------------------
 
  18
 
  session_start();
 
  if(isset($_SESSION['username']))
 
  {
 
  @mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
 
  or die("数据库服务器连接失败");
 
  @mysql_select_db("test")      //选择数据库mydb
 
  or die("数据库不存在或不可用");
 
  //获取Session
 
  $username = $_SESSION['username'];
 
  //执行SQL语句获得userflag的值
 
  $query = @mysql_query("select userflag from users "
 
  ."where username = '$username'")
 
  or die("SQL语句执行失败");
 
  $row = mysql_fetch_array($query);
 
  //判断当前数据库中的权限信息与Session中的信息比较,如果不同则更新Session的信息
 
  if($row['userflag'] != $_SESSION['userflag'])
 
  {
 
  $_SESSION['userflag'] = $row['userflag'];
 
  }
 
  //根据Session的值输出不同的欢迎信息
 
  if($_SESSION['userflag'] == 1)
 
  echo "欢迎管理员".$_SESSION['username']."登录系统";
 
  if($_SESSION['userflag'] == 0)
 
  echo "欢迎用户".$_SESSION['username']."登录系统";
 
  echo "注销";
 
  }
 
  else
 
  {
 
  echo "您没有权限访问本页面";
 
  }
 
  ?>
 
  19 -------------------------------------------------------------------------------------------------------------------------
 
  20 -------------------------------------------------------------cookie登录验证实例---------------------------------------------
 
  21
 
  22
 
  23 用户名:
 
  24 密码:
 
  25 Cookie保存时间:
 
  26
 
  27
 
  28 -------------------------------------------------------------------------------------------------------------------------
 
  29
 
  @mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
 
  or die("数据库服务器连接失败");
 
  @mysql_select_db("test")      //选择数据库mydb
 
  or die("数据库不存在或不可用");
 
  //获取用户输入
 
  $username = $_POST['username'];
 
  $passcode = $_POST['passcode'];
 
  $cookie   = $_POST['cookie'];
 
  //执行SQL语句
 
  $query = @mysql_query("select username, userflag from users "
 
  ."where username = '$username' and passcode = '$passcode'")
 
  or die("SQL语句执行失败");
 
  //判断用户是否存在,密码是否正确
 
  if($row = mysql_fetch_array($query))
 
  {
 
  if($row['userflag'] == 1 or $row['userflag'] == 0)    //判断用户权限信息是否有效
 
  {
 
  switch($cookie)         //根据用户的选择设置cookie保存时间
 
  {
 
  case 0:         //保存Cookie为浏览器进程
 
  setcookie("username", $row['username']);
 
  break;
 
  case 1:         //保存1天
 
  setcookie("username", $row['username'], time()+24*60*60);
 
  break;
 
  case 2:         //保存30天
 
  setcookie("username", $row['username'], time()+30*24*60*60);
 
  break;
 
  case 3:         //保存365天
 
  setcookie("username", $row['username'], time()+365*24*60*60);
 
  break;
 
  }
 
  header("location: main.php");      //自动跳转到main.php
 
  }
 
  else
 
  {
 
  echo "用户权限信息不正确";
 
  }
 
  }
 
  else
 
  {
 
  echo "用户名或密码错误";
 
  }
 
  ?>
 
  30 -------------------------------------------------------------------------------------------------------------------------
 
  31
 
  session_start();
 
  if(isset($_COOKIE['username']))
 
  {
 
  @mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
 
  or die("数据库服务器连接失败");
 
  @mysql_select_db("test")      //选择数据库mydb
 
  or die("数据库不存在或不可用");
 
  //获取Session
 
  $username = $_COOKIE['username'];
 
  //执行SQL语句获得userflag的值
 
  $query = @mysql_query("select userflag from users "
 
  ."where username = '$username'")
 
  or die("SQL语句执行失败");
 
  $row = mysql_fetch_array($query);
 
  //获得用户权限信息
 
  $flag = $row['userflag'];
 
  //根据userflag的值输出不同的欢迎信息
 
  if($flag == 1)
 
  echo "欢迎管理员".$_COOKIE['username']."登录系统";
 
  if($flag == 0)
 
  echo "欢迎用户".$_COOKIE['username']."登录系统";
 
  echo "注销";
 
  }
 
  else
 
  {
 
  echo "您没有权限访问本页面";
 
  }
 
  ?>
 
  32 -------------------------------------------------------------------------------------------------------------------------
 
  33
 
  setcookie("username");
 
  echo "注销成功";
 
  ?>
 
  34 

  最后说明:
 
  1.上面保证了token每次登录都会不一样,这回导致之前的token【既cookie】失效
 
  2.cookie的有效期最好不超过一周
 
  3.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)
 
  4.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE
 
  感觉效率和安全性都不是很好
 
  1.用户访问每个页面都要去跟数据库验证一遍
 
  2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性
 

(编辑:92站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章