① php中使用session防止用戶非法登錄後台的方法
本文實例講述了php中使用session防止用戶非法登錄後台的方法。分享給大家供大家參考。具體如下:
一般來說,我們登錄網站後台時,伺服器會把登錄信息保存到session文件里,並通過讀取session文件來判斷是否可以進行後台操作。
以下面為例,假如admin.php是我們的後台操作頁面,如果沒有啟用
session,那麼,即便是沒有登錄,用戶照樣能訪問到該頁面,這時候,就需要用到
session
來防止用戶非法登錄到這個頁面了。下面是三個文件的代碼
登錄頁面:login.php
復制代碼
代碼如下:<h2>用戶登錄頁面</h2>
<form
action="loginProcess.php"
method="post">
用戶名:<input
type="text"
name="username"><br
/>
密 碼:<input
type="password"
name="pwd"><br
/>
<input
type="submit"
name="sub"
value="登錄後台">
</form>
<?php
if(!empty($_GET['errno'])){
if($_GET['errno']==1){
echo
"用戶名或密碼錯誤";
}else
if($_GET['errno']==2){
echo
"請輸入用戶名密碼";
}else
if($_GET['errno']==3){
echo
"非法訪問,請輸入用戶名和密碼";
}
}
?>
登錄信息處理頁面:loginProcess.php
復制代碼
代碼如下:<?php
//這里主要講session,關於登錄信息驗證,就不涉及到資料庫了
//接收登錄信息,保存session
if(!empty($_POST['sub'])){
if($_POST['username']=="admin"
&&
$_POST['pwd']=="admin"){
echo
"登錄成功";
session_start();//開啟session
$_SESSION['username']
=
$_POST['username'];//將登錄名保存到session中
header("Location:
admin.php");
exit();
}else{
header("Location:
login.php?errno=1");
exit();
}
}else{
header("Location:
login.php?errno=2");
exit();
}
?>
後台文件:admin.php
復制代碼
代碼如下:<?php
session_start();
if(empty($_SESSION['username'])){
header("Location:
login.php?errno=3");
exit();
}
echo
"你是管理員,你現在擁有後台管理許可權";
?>
希望本文所述對大家的php程序設計有所幫助。
② PHP會話驗證問題,怎麼解決
會話控制的思想就是指能夠在網站中根據一個會話跟蹤用戶。這里整理了詳細的代碼,有需要的小夥伴可以參考下。
概述
http 協議是無狀態的,對於每個請求,服務端無法區分用戶。PHP 會話控制就是給了用戶一把鑰匙(一個加密session字元串),同時這也是用戶身份的一個證明,服務端存放了這把鑰匙能打開的箱子(資料庫,內存資料庫或者使用文件做的),箱子裡面裝的就是用戶的各個變數信息。
傳統的php session 使用
<?php
//page1.php 啟動一個會話並注冊一個變數
session_start();
$_SESSION['user_var'] = "hello,codekissyoung!";
//這里的可以將$_SESSION理解為用戶的箱子,實際的實現是php在伺服器端生成的小文件
?>
<?php
//page2.php
session_start();
echo $_SESSION['user_var'];//通過鑰匙訪問自己的箱子內的變數
$_SESSION['user_var'] = "bey,codekissyoung!";
?>
<?php
//page3.php 銷毀鑰匙,一般在用戶注銷時,訪問page3.php文件
session_start();
session_destroy();
?>
提一個問題,鑰匙呢?沒看見給用戶鑰匙的操作啊?
這個操作是php背後幫我們做了的,自從你訪問page1.php 程序運行,session_start();這句時,php 會根據此刻的一些條件(用戶ip,瀏覽器號,時間等)生成一個PHPSESSID變數,http response 回客戶端後,這個PHPSESSID就已經存在你的瀏覽器cookie里了,每次你再次訪問這個域名時,該PHPSESSID都會發送到服務端。這個PHPSESSID 就是我這里說的用戶鑰匙了。
再一個問題,這個PHPSESSID的安全性,它是否容易被竊取,是否容易被偽造,是否容易被篡改?
使用 Https 可以防止被篡改。不使用PHPSESSID,而是自己生成一把秘鑰給用戶可以防止被偽造。至於是否容易被竊取,還真沒怎麼研究過。比如如果你電腦連著網,黑客入侵你電腦。
將生成的秘鑰存入瀏覽器cookie中
設置cookie
setCookie('key','value',time()+3600);
刪除cookie
setCookie('key','',time()-1);
實現單點登錄:session共享
單點登錄:多個子系統之間共用一套用戶驗證體系,在其中一處登錄,就可以訪問所有子系統。
試想這么一種情景:假設伺服器A與B的php環境一致。用戶在 伺服器A 上拿到了自己的鑰匙,然後他拿著這把鑰匙去訪問伺服器B,請問伺服器B認識么?
很顯然不能,伺服器A生成的鑰匙,伺服器並不認識。
解決辦法:用戶無論訪問A或B,生成的鑰匙我都存儲在C(同一個資料庫,或緩存系統)中,用戶再次訪問A或B時,A和B都去問下C:這個用戶的鑰匙對么?對的話,用戶就可以使用自己存在A或者B那裡的箱子了。
下面是php通過會話控制實現身份驗證實例
身份驗證應用程序主體:authmain.PHP
網站的有效用戶檢查:members_only.php
注銷會話變數並銷毀會話:logout.php
③ php登錄驗證問題session
你可以在資料庫中創建一個session表,裡面存放已登錄用戶的
用戶名、登陸IP、隨機碼
重要提示:用戶每成功登陸一次,那麼就更新IP和隨機碼,隨機碼會存在$_SESSION['code']里
假設A在機器01上登陸過,那麼seesion表存 A、127.0.0.1、123456
情況(1):
1、當A在另外一個機器02從登陸頁面登陸,那麼按「重要提示」的操作方法,session的數據會被更新成 A、127.0.0.2、456789.
2、然後A在第一台機器01上刷新網頁,程序發現資料庫中A最新的登陸IP有變動,那麼在機器01上將A踢下線。
情況(2):
1、A在同一機器上的另外一個瀏覽器從登陸頁面登陸,那麼按「重要提示」的操作方法,session的數據會被更新成 A、127.0.0.1、987545.
2、然後A在第一台機器01上的第一個瀏覽器刷新網頁,程序發現該瀏覽器與伺服器的SESSION中保存的$_SESSION['code']與資料庫中A最新的登陸隨機碼不同,那麼在第一個瀏覽器上將A踢下線。
補充一點:同一台機器上所有利用IE內核的瀏覽器,其實session是通用的,不管你用純正的IE、還是各大瀏覽器的兼容模式,或者是IETester的各個瀏覽器版本
④ php網站驗證登錄後怎麼跳向用戶管理頁面
PHP登陸後跳轉到用戶管理頁面,利用$_SERVER全局變數可以實現這個功能。
具體實現方法為:在提示用戶登錄的同時,在session或者cookie中記錄下請求頁面的URL;登錄驗證成功後在跳轉回該URL。
1、checklogin.php代碼:
session_start();
if (!isset ($_SESSION['login_ok']))
{
echo "<script language=javascript>alert ('要訪問的頁面需要先登錄。');</script>";
$_SESSION['userurl'] = $_SERVER['REQUEST_URI'];
echo '<script language=javascript>window.location.href="login.php"</script>';
}
2、login.php代碼
session_start();
//此處省略了賬號密碼驗證代碼,驗證OK再執行下面代碼
if (isset ($_SESSION['userurl']))
{
//會話中有要跳轉的頁面
$url = $_SESSION['userurl'];
}
else
{
//沒有要跳轉的頁面,則轉到首頁
$url = "userManager.php";
}
//0.5s後跳轉
echo "<meta http-equiv=\"refresh\" content=\"0.5;url=$url\">";