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

我大概是这样做的:

(1)生成用户验证token
    用户登录后我会生成一个token,该token可能由如下信息组成:username+ip+expiration+salt【只是举例】,然后将组成信息用可逆加密函数加密得到token,并将该token保存到数据库,写入cookie;

(2)最后这样去校验信息,判断用户的登录状态
    将token解密,验证用户username,如果存在,继续;然后验证token是否和存入数据库的token相同,如果相同继续;验证cookie的有效期expiration,如果有效继续;验证ip是否变化,若变化跳入登录。。。。。。甚至还可以验证user agent.

例子

php session应用实例--登录验证:

 代码如下 复制代码

<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="login.php">
<table width="300" border="0" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150"><div align="right">用户名:</div></td>
<td width="150"><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="passcode"></td>
</tr>
<tr>
<td><div align="right">Cookie保存时间:</div></td>
<td><select name="cookie" id="cookie">
<option value="0" selected>浏览器进程</option>
<option value="1">保存1天</option>
<option value="2">保存30天</option>
<option value="3">保存365天</option>
</select></td>
</tr>
</table>
<p align="center">
<input type="submit" name="Submit" value="Submit">
<input type="reset" name="Reset" value="Reset">
</p>
</form>
</body>
</html>

-------------------------------------------------------------------------------------------------------------------------

<?php
@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 "<a href="main.php" mce_href="main.php">欢迎登录,点击此处进入欢迎界面</a>";
}
else          //如果权限信息无效输出错误信息
{
echo "用户权限信息不正确";
}
}
else           //如果用户名和密码不正确,则输出错误
{
echo "用户名或密码错误";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php

session_start();
unset($_SESSION['username']);
unset($_SESSION['passcode']);
unset($_SESSION['userflag']);

// 最后彻底销毁session.
         session_destroy();

echo "注销成功";
?>

         <?php
         // 初始化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();
         ?>

由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

-------------------------------------------------------------------------------------------------------------------------

<?php
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 "<a href="logout.php" mce_href="logout.php">注销</a>";
}
else
{
echo "您没有权限访问本页面";
}
?>

-------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------cookie登录验证实例---------------------------------------------

<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="login.php">
<table width="300" border="0" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150"><div align="right">用户名:</div></td>
<td width="150"><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="passcode"></td>
</tr>
<tr>
<td><div align="right">Cookie保存时间:</div></td>
<td><select name="cookie" id="cookie">
<option value="0" selected>浏览器进程</option>
<option value="1">保存1天</option>
<option value="2">保存30天</option>
<option value="3">保存365天</option>
</select></td>
</tr>
</table>
<p align="center">
<input type="submit" name="Submit" value="Submit">
<input type="reset" name="Reset" value="Reset">
</p>
</form>
</body>
</html>

-------------------------------------------------------------------------------------------------------------------------

<?php
@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 "用户名或密码错误";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php
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 "<a href="logout.php" mce_href="logout.php">注销</a>";
}
else
{
echo "您没有权限访问本页面";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php
setcookie("username");
echo "注销成功";
?>

 

最后说明:

1.上面保证了token每次登录都会不一样,这回导致之前的token【既cookie】失效

2.cookie的有效期最好不超过一周

3.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)

4.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE

感觉效率和安全性都不是很好

1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性

时间: 2024-10-26 04:17:21

php cookie记录登录信息的原理与实例的相关文章

php cookie用户登录的详解及实例代码

php cookie用户登录的实现 HTML源码: <html> <head> <title>php cookie用户登录的实现</title> </head> <body> <form name="forml" method="POST" action="CookieBasedPasswordLogin.php"> <table> <tr>

想用COOKIE保存登录信息,这个建cookie对象的代码应该写在哪里?在哪里提取?

问题描述 很基础的问题,是写在登录按钮的动作上吗?本人菜鸟,急需相信解答 解决方案 解决方案二:是直接存就行了就是不知道你的浏览器是否禁用cookie解决方案三:..登录的Button事件里protectedvoidButton1_Click(objectsender,EventArgse){HttpCookiecookie=newHttpCookie("名称","值");cookie.Expires=DateTime.Now.AddDays(1);//设置过期Re

SQLSERVER记录登录用户的登录时间(自写脚本)_MsSql

前一阵子经理问我能不能把用户最后一次登录我们的业务数据库的时间记录下来,因为之前有人修改过数据库sa用户的登录密码,所以我们要记录一下. 我查了一下资料,好像不能记录谁登录过业务库,只能记录谁登录过SQLSERVER 数据库版本是SQL2005 ,操作系统:Windows7 下面是本人写的一个脚本,我的实现原理是使用触发器,触发器是登录触发器,范围是整个服务器范围,如果有人登录过,就使用 bcp命令把登录信息记录日志文件 1.如果原来数据库已经存在触发器把他删掉 复制代码 代码如下: USE M

SQLSERVER记录登录用户的登录时间(自写脚本)

前一阵子经理问我能不能把用户最后一次登录我们的业务数据库的时间记录下来,因为之前有人修改过数据库sa用户的登录密码,所以我们要记录一下. 我查了一下资料,好像不能记录谁登录过业务库,只能记录谁登录过SQLSERVER 数据库版本是SQL2005 ,操作系统:Windows7 下面是本人写的一个脚本,我的实现原理是使用触发器,触发器是登录触发器,范围是整个服务器范围,如果有人登录过,就使用 bcp命令把登录信息记录日志文件 1.如果原来数据库已经存在触发器把他删掉 复制代码 代码如下: USE M

SQLSERVER记录登录用户的登录时间sql语句

bcp命令把登录信息记录日志文件 1.如果原来数据库已经存在触发器把他删掉  代码如下 复制代码 1 USE MASTER 2 GO 3 DROP TRIGGER trg_logon_attempttest ON ALL SERVER 4 GO2 .在D盘新建一个文本文件 d:Logondata.txt  这个文本文件用来记录登录信息 3.创建一个登录触发器审核登录事件  代码如下 复制代码 CREATE TRIGGER trg_logon_attempttest  ON ALL SERVER

Yii中实现处理前后台登录的新方法_php实例

本文实例讲述了Yii中实现处理前后台登录的新方法.分享给大家供大家参考,具体如下: 因为最近在做一个项目涉及到前后台登录问题,我是把后台作为一个模块(Module)来处理的.我看很多人放两个入口文件index.php和admin.php,然后分别指向前台和后台.这种方法固然很好,可以将前后台完全分离,但我总觉得这种方式有点牵强,这和两个应用啥区别?还不如做两个App用一个framework更好.而且Yii官方后台使用方法也是使用Module的方式.但是Moudle的方式有一个很头疼的问题,就是在

php中如何同时使用session和cookie来保存用户登录信息

本篇文章是对在php中同时使用session和cookie来保存用户登录信息的实现代码进行了详细的分析介绍,需要的朋友参考下   同时使用session和cookie来保存用户登录信息1.数据库连接配置页面:connectvars.php 复制代码 代码如下: <?php //数据库的位置 define('DB_HOST', '127.0.0.1'); //用户名 define('DB_USER', 'root'); //口令 define('DB_PASSWORD', '19900101');

asp.net Cookie记录用户登录次数与防止同一账户重复登录

asp教程.net cookie记录用户登录次数与防止同一账户重复登录 放在登陆成功的地方:  string key = textbox1.text; //用户名文本框设为cache关键字  string uer = convert.tostring(cache[key]); //读取cache中用户相应的值 if (uer == null || uer == string.empty)//判断cache中是否有用户的信息,如果没有相关的值,说明用户未登陆 {   //定义cache过期时间  

php中如何同时使用session和cookie来保存用户登录信息_php技巧

同时使用session和cookie来保存用户登录信息1.数据库连接配置页面:connectvars.php 复制代码 代码如下: <?php//数据库的位置define('DB_HOST', '127.0.0.1');//用户名define('DB_USER', 'root');//口令define('DB_PASSWORD', '19900101');//数据库名define('DB_NAME','test') ;?> 2.登录页面:logIn.php 复制代码 代码如下: <?ph