萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php cookie記錄登錄信息的原理與實例

php cookie記錄登錄信息的原理與實例

cookie登錄我們一般會對保存在cookie中的值越冬加密處理,然後每次判斷時再把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.加密碼雖然規則很復雜,但是保存在客戶端依然存在被破解的可能性

copyright © 萬盛學電腦網 all rights reserved