【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应用实例--登录验证:
代码如下
-------------------------------------------------------------------------------------------------------------------------
@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登录验证实例---------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
@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.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性