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

更新时间:2019-05-06    来源:代码生成    手机版     字体:

【www.bbyears.com--代码生成】

我大概是这样做的:

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

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

例子

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

 代码如下



Login





用户名:



密码:
word" name="passcode">


Cookie保存时间:









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

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

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

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

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

echo "注销成功";
?>

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

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


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 "您没有权限访问本页面";
}
?>

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

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




Login





用户名:



密码:
word" name="passcode">


Cookie保存时间:









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

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

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

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 "您没有权限访问本页面";
}
?>

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

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


 

最后说明:

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

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

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

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

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

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

本文来源:http://www.bbyears.com/wangyetexiao/49954.html

热门标签

更多>>

本类排行