中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > PHP Token(令牌)設(shè)計
對一些編程初學(xué)者的良言警句 回到列表 搜索自動提示功能的實現(xiàn)
 PHP Token(令牌)設(shè)計

作者:xling 時間: 2008-03-14 文檔類型:原創(chuàng) 來自:藍色理想

第 1 頁 PHP Token(令牌)設(shè)計 [1]
第 2 頁 PHP Token(令牌)設(shè)計 [2]

請大家看代碼,感覺哪里有不合理的地方,還請賜教!謝謝.

加密我是找的網(wǎng)上的一個方法,稍作了一下修改.

GEncrypt.inc.php:

<?php
class GEncrypt extends GSuperclass {
    protected static function keyED($txt,$encrypt_key){  
        $encrypt_key = md5($encrypt_key);  
        $ctr=0;  
        $tmp = "";  
        for ($i=0;$i<strlen($txt);$i++){  
            if ($ctr==strlen($encrypt_key)) $ctr=0;  
            $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);  
            $ctr++;  
        }  
        return $tmp;  
    }
   
    public static function encrypt($txt,$key){  
        //$encrypt_key = md5(rand(0,32000));
        $encrypt_key = md5(((float) date("YmdHis") + rand(10000000000000000,99999999999999999)).rand(100000,999999));
        $ctr=0;  
        $tmp = "";  
        for ($i=0;$i<strlen($txt);$i++){
            if ($ctr==strlen($encrypt_key)) $ctr=0;  
            $tmp.= substr($encrypt_key,$ctr,1) . (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));  
            $ctr++;  
        }  
        return base64_encode(self::keyED($tmp,$key));
    }
   
    public static function decrypt($txt,$key){
        $txt = self::keyED( base64_decode($txt),$key);  
        $tmp = "";
        for ($i=0;$i<strlen($txt);$i++){  
            $md5 = substr($txt,$i,1);  
            $i++;  
            $tmp.= (substr($txt,$i,1) ^ $md5);  
        }
        return $tmp;
    }   
}
?>

GToken.inc.php
方法:

a,granteToken 參數(shù):formName,即動作名稱,key是加密/解密 密鑰.
返回一個字符串,形式是: 加密(formName:session_id)

b,isToken 參數(shù):token 即granteToken產(chǎn)生的結(jié)果,formName,動作名稱,fromCheck是否檢查來路,如果為真,還要判斷token里的session_id是否和當前的session_id一至.

c,dropToken,當成功執(zhí)行一個動作后,調(diào)用這個函數(shù),把這個token記入session里,

<?php
/**
* 原理:請求分配token的時候,想辦法分配一個唯一的token, base64( time + rand + action)
* 如果提交,將這個token記錄,說明這個token以經(jīng)使用,可以跟據(jù)它來避免重復(fù)提交。
*
*/
class GToken {
   
    /**
     * 得到當前所有的token
     *
     * @return array
     */
    public static function getTokens(){
        $tokens = $_SESSION[GConfig::SESSION_KEY_TOKEN ];
        if (empty($tokens) && !is_array($tokens)) {
            $tokens = array();
        }
        return $tokens;
    }
   
    /**
     * 產(chǎn)生一個新的Token
     *
     * @param string $formName
     * @param 加密密鑰 $key
     * @return string
     */
   
    public static function granteToken($formName,$key = GConfig::ENCRYPT_KEY ){
        $token = GEncrypt::encrypt($formName.":".session_id(),$key);
        return $token;
    }
   
    /**
     * 刪除token,實際是向session 的一個數(shù)組里加入一個元素,說明這個token以經(jīng)使用過,以避免數(shù)據(jù)重復(fù)提交。
     *
     * @param string $token
     */
    public static function dropToken($token){
        $tokens = self::getTokens();
        $tokens[] = $token;
        GSession::set(GConfig::SESSION_KEY_TOKEN ,$tokens);
    }
   
    /**
     * 檢查是否為指定的Token
     *
     * @param string $token    要檢查的token值
     * @param string $formName
     * @param boolean $fromCheck 是否檢查來路,如果為true,會判斷token中附加的session_id是否和當前session_id一至.
     * @param string $key 加密密鑰
     * @return boolean
     */
   
    public static function isToken($token,$formName,$fromCheck = false,$key = GConfig::ENCRYPT_KEY){
        $tokens = self::getTokens();
       
        if (in_array($token,$tokens)) //如果存在,說明是以使用過的token
            return false;
           
        $source = split(":", GEncrypt::decrypt($token,$key));
       
        if($fromCheck)
            return $source[1] == session_id() && $source[0] == $formName;
        else
            return $source[0] == $formName;
    }
}
?>

示例:

首先從$_POST里取出token,用isToken判斷.

<?php
include("../common.inc.php");
$token = $_POST["token"];
if (GToken::isToken($token,"adminLogin",true)) {
    $vCode = $_POST["vCode"];
    if (strtoupper($vCode) != strtoupper($_SESSION[GConfig::SESSION_KEY_VALIDATE_CODE ])) {
        throw new Exception("驗證碼不正確!");
    }
       
    $vo = new VO_Admin();
    $vo->setNickName($_POST["name"]);
    $vo->setPwd($_POST["pwd"]);
   
    $mo = new MO_Admin();
    $mo->setVO($vo);
   
   
    $f = $mo->login();
    if(!$f){
        throw new Exception("用戶名或密碼不正確!");
    }else{
        GToken::dropToken($token);
        //header("location:".GDir::getRelativePath("/admin/index.php"));
        echo "here"; //如果是外部提交的,這句就不會打印出來!
    }
}
$sFile = GDir::getAbsPath(GConfig::DIR_SERIALIZE ,"admin/login");
$tpl = GSerialize::load($sFile);
if ($tpl === false) {
    $tpl = new GTpl(GConfig::DIR_SKIN ,GConfig::DEBUG_TPL_FILE );
    $tpl->load(array(
        "header"    =>    "admin/header.html",
        "footer"    =>    "admin/footer.html",
        "admLogin"    =>    "admin/login.html",
        "admLoginJs"=>    "admin/loginJs.html"
    ));   
    GSerialize::save($tpl,$sFile);
}
$tpl->assign("title","管理員登陸");
$tpl->assign("path",GDir::getRelativePath(SITE_DIR));
$tpl->assign("vImg",GDir::getRelativePath("/vImg.php"));
if (MO_Admin::isLogined()) {
    $tpl->parseBlock("blk_logined");
}else {
    $tpl->assign("token",GToken::granteToken("adminLogin"));
    $tpl->parseBlock("blk_loadScripts","cond_notLogin");   
    $tpl->parseBlock("blk_notLogin");
}
echo $tpl->parse("header");
echo $tpl->parse("admLogin");
echo $tpl->parse("footer");
echo $tpl->parse("admLoginJs");
?>

這一切看著似乎是沒有問題了.
如果想判斷是否是執(zhí)行的匹配動作,可以把isToken里的formName改一下,運行,很好,沒有匹配上.證明這個成功.

是否能避免重復(fù)提交,我沒有驗證,太簡單的邏輯了.

余下的就是判斷 來路檢查 是否正常工作了.
把上面的示例產(chǎn)生的html copy到本地的一個網(wǎng)頁內(nèi)(以達到不同的域的目的),運行,檢查來路不明,沒有執(zhí)行動作(需要把isToken的第三個參數(shù)設(shè)為true).
把isToken的第三個參數(shù)設(shè)置為false,提交,指定的動作執(zhí)行了!

好了,到此為止,不知道哪個地方是否還存在BUG,這就要在長期運用中慢慢調(diào)試修改了!

經(jīng)典論壇討論
http://bbs.blueidea.com/thread-2837707-1-1.html

本文鏈接:http://m.95time.cn/tech/program/2008/5494.asp 

出處:藍色理想
責任編輯:bluehearts

上一頁 PHP Token(令牌)設(shè)計 [1] 下一頁

◎進入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
搜索自動提示功能的實現(xiàn)
在線執(zhí)行PHP代碼包裝版
php項目打包
發(fā)散思維學(xué)習(xí)PHP
使用Flex和PHP創(chuàng)建自己的視頻應(yīng)用
作者文章
[JS]用 或 || 來兼容FireFox
iframe 的用法與注意事項
幾行代碼搞定一棵漂亮的樹
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計比賽 網(wǎng)頁制作 web標準 用戶體驗 UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點最新 站點最新列表
周大福“敬•自然”設(shè)計大賽開啟
國際體驗設(shè)計大會7月將在京舉行
中國國防科技信息中心標志征集
云計算如何讓安全問題可控
云計算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機會
阿里行云
云手機年終巨獻,送禮標配299起
阿里巴巴CTO王堅的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機主題設(shè)計大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個可愛的鉛筆圖標
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機制之一:普通流
25個最佳最閃亮的Eclipse開發(fā)項目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁 首頁 前頁 后頁 尾頁 頁次:2/21個記錄/頁 轉(zhuǎn)到 頁 共2個記錄

藍色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準打上各自站點的水印,亦不能抹去我站點水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯誤,請用報告錯誤,以利文檔及時修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報告管理員,以利管理員及時刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項有關(guān)法律法規(guī)
·承擔一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報告錯誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計》
犀利開發(fā)—jQuery內(nèi)核詳解與實踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2