本文目錄一覽:
PHP驗證碼工具-Securimage如何運用到網頁中
這是PHP驗證碼工具-Securimage的源地址:phpcaptcha.org/documentation/quickstart-guide/告訴做的步驟,我做到第2部分的時候就沒勝利了!
檢驗用戶是否有權使用某功能的織夢函數TestPurview
函數TestPurview($n)雖然,看上去只是一個相對比較簡單的函數,但是這個函數是非常非常重要的,試想一下如果一個系統中沒有檢驗某個用
戶是否有權限操作某些功能的話,那麼,這個系統一定非常危險,因為,隨便一個人都可以操作某個功能,例如,進入後台,刪除欄目,刪除數據庫等,就如同一個
家四周都沒有牆一樣,隨便什麼人都可以進入,這樣的家完全就是公共場合,完全沒有什麼安全可言,一個系統也是如此。
所以,檢測系統函數就比較重要了,當然,光這個一個函數還不夠,不光要檢驗用戶的使用權限,還要檢驗用戶密碼,是不是管理員,甚至是用戶登錄ip等,都要檢驗一下,這樣才可以稱得上安全的系統。
本函數在「管理員登陸類」userlogin.class.php裏面的第一個函數就是它,返回的值是true或false,若有權限則返回trure否則返回false。
通過教程「織夢中cookie和session的應用」我們知道了,當我們登錄後台後,織夢系統會把登錄的用戶信息寫入session裏面,並把session存放在/data/session文件夾裏面。
因為不同的用戶登錄後台,產生的session是不一樣的,我就在後台註冊一個發佈員,用戶名為fby。並且,在後台定義「信息發佈員」的權限如下圖所示。
登錄/註冊後可看大圖
我整理了一下「信息發佈員」的權限如下:
列出授權欄目(t_AccList)
發佈授權文檔(a_AccNew)
列出授權文檔(a_AccList)
列出我發佈的文檔(a_MyList)
修改我發佈的文檔(a_MyEdit)
刪除我發佈的文檔(a_MyDel)
更改個人密碼(sys_MdPwd)
評論管理(sys_Feedback)
管理我的上傳(sys_MyUpload)
當我用fby用戶名登錄後,在data/session/文件夾裏面,生成一個名為sess_3vtlqpg0pnlmc63pd5ai86gl16 的 session 。這個session裏面的內容如下所示。
securimage_code_value|s:4:”npll”;
dede_admin_id|s:1:”8″;
dede_admin_type|s:1:”1″;
dede_admin_channel|s:0:””;
dede_admin_name|s:3:”fby”;
font color=”Blue”dede_admin_purview|s:107:”t_AccList
a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd sys_Feedback
sys_MyUpload plus_留言簿模塊 “;/font
dede_admin_style|s:10:”newdedecms”;
複製代碼
如果我們以超級管理員,也就是最高級別的身份登錄後台後,我們同樣得到類似的如下內容。
securimage_code_value|s:4:”2gsf”;
dede_admin_id|s:1:”1″;
dede_admin_type|s:2:”10″;
dede_admin_channel|s:1:”0″;
dede_admin_name|s:5:”admin”;
font color=”Blue”dede_admin_purview|s:15:”admin_AllowAll “;/font
dede_admin_style|s:10:”newdedecms”;
複製代碼
當登錄後,這些是如何生成的?這個我們在上面提到了,以前的教程已經詳細講解了,其實,就是通過「管理員登陸類」userlogin.class.php裏面的函數來實現的,當然,不只是這個文件。
我們分析上面這些,完全就是為了函數TestPurview($n)作準備的,好了,現在我們來分析一下這個用戶權限檢驗函數。
函數:
function TestPurview($n)
{
$rs = FALSE;
$purview = $GLOBALS[‘cuserLogin’]-getPurview();
if(preg_match(‘/admin_AllowAll/i’,$purview))
{
return TRUE;
}
if($n==”)
{
return TRUE;
}
if(!isset($GLOBALS[‘groupRanks’]))
{
$GLOBALS[‘groupRanks’] = explode(‘ ‘,$purview);
}
$ns = explode(‘,’,$n);
foreach($ns as $n)
{
//只要找到一個匹配的權限,即可認為用戶有權訪問此頁面
if($n==”)
{
continue;
}
if(in_array($n,$GLOBALS[‘groupRanks’]))
{
$rs = TRUE; break;
}
}
return $rs;
}
複製代碼
通過getPurview()方法,我們從session得到了dede_admin_purview裏面的值,因
為,$GLOBALS[‘cuserLogin’]是實例化「登錄類」的對像,而這個登錄類的構造函數,在我們實例化時,已經把session裏面的值賦
給了$this-userPurview,代碼如下所示。
$this-userID = $_SESSION[$this-keepUserIDTag];
$this-userType = $_SESSION[$this-keepUserTypeTag];
$this-userChannel = $_SESSION[$this-keepUserChannelTag];
$this-userName = $_SESSION[$this-keepUserNameTag];
$this-userPurview = $_SESSION[$this-keepUserPurviewTag];
$this-adminStyle = $_SESSION[$this-keepAdminStyleTag];
複製代碼
從上面代碼我們就不難發現$this-userPurview=$_SESSION[‘dede_admin_purview’],即
t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模塊這些值,明白了這一點,這個TestPurview($n)就簡單多了。
1、條件判斷:
if(preg_match(‘/admin_AllowAll/i’,$purview))
{
return TRUE;
}
複製代碼
如果我們用的是管理員登錄,那麼,$_SESSION[‘dede_admin_purview’]的值等於admin_AllowAll,返回true,所以,這句代碼就是判斷是不是管理登錄。
2、條件判斷
if($n==”)
{
return TRUE;
}
複製代碼
若參數為空,直接返回true,也就是說,只要不提供功能參數,就認為是可以操作的,所以,這一點要注意了,如果你不小心,忘記寫參數,那麼,很可能本想過慮掉的用戶結果沒有過慮掉,這是非常危險的,所以,這個最好有個提示,有個對話框,這樣可以提醒管理員。
3、把登錄的後台的用戶的權限,例如,本例子中的「信息發佈員」權限$_SESSION[‘dede_admin_purview’],轉換成數組存放到全局變量$GLOBALS[‘groupRanks’]裏面,以備下面之用。
if(!isset($GLOBALS[‘groupRanks’]))
{
$GLOBALS[‘groupRanks’] = explode(‘ ‘,$purview);
}
複製代碼
4、把功能參數轉換成數組:$ns = explode(‘,’,$n);
5、遍歷:foreach($ns as
$n),就是把傳遞過來的功能參數,通過in_array($n,$GLOBALS[‘groupRanks’])這個函數進行對比,看一下$n裏面的有
沒有存功能在數組$_SESSION[‘dede_admin_purview’]裏面。例如:本例子信息發佈員的權限在上我們已經知道了
有:t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模塊這些值。
如果$n是:a_AccNew,t_New,經過上面一個遍歷,我們發現,其中a_AccNew在數
組$GLOBALS[‘groupRanks’],函數立馬跳出來,返回一個true,也就是說織夢的這個函數,只要$n裏面有一個是
與$GLOBALS[‘groupRanks’]裏面的值一樣,
就可以操作這個頁面。而不需要全部都在$GLOBALS[‘groupRanks’]裏面才可以操作這個頁面。
當然,你可以根據自己需要,直接嚴格匹配,只有全部都在登錄用戶的權限裏面才可以操作頁面。這個功能也簡單,只要作如下更改:
if(!in_array($n,$GLOBALS[‘groupRanks’]))
{
$rs = FALSE; break;
}
複製代碼
也就是把$n參數裏面的值判斷一下,只要有一個不在登錄用戶的權限裏面,就返回false,退出操作。
securimage 怎麼調用
Securimage是php強大的驗證碼工具 ,使用起來非常簡單和方便,並且支持ajax調用,因此在這裡給大家推薦一下。
img id=”siimage” style=”border: 1px solid #000; margin-right: 15px” src=”securimage_show.php?sid=?php echo md5(uniqid()) ?” alt=”CAPTCHA Image” align=”left”
a tabindex=”-1″ style=”border-style: none;” href=”#” title=”Refresh Image” onclick=”document.getElementById(‘siimage’).src = ‘securimage_show.php?sid=’ + Math.random(); this.blur(); return false;”img src=”securimage/images/refresh.png” alt=”Reload Image” onclick=”this.blur()” align=”bottom” border=”0″/abr /
網站後台登陸時 驗證碼無法刷新
貼出驗證碼顯示的 代碼吧.
這樣更便於分析原因並解決之。
可以給提提供一個思路。不刷新可能是由於驗證碼被緩存了。如果驗證嗎頁面禁止緩存可能會解決問題。
還有可以在每次顯示驗證碼是 傳入一個無用的但每次都不一樣的隨機數參數,也可以防止緩存
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/181441.html