PHP Token(令牌)設(shè)計(jì)(3)_PHP教程
推薦:如何用php過濾危險(xiǎn)html代碼用PHP過濾html里可能被利用來引入外部危險(xiǎn)內(nèi)容的代碼。有些時(shí)候,需要讓用戶提交html內(nèi)容,以便豐富用戶發(fā)布的信息,當(dāng)然,有些可能造成顯示頁面布局混亂的代碼也在過濾范圍內(nèi)。 #用戶發(fā)布的html,過濾危險(xiǎn)代碼 function uh(str) { farr = array( /\s+/, //
/**
* 檢查是否為指定的Token
*
* @param string token 要檢查的token值
* @param string formName
* @param boolean fromCheck 是否檢查來路,如果為true,會(huì)判斷token中附加的session_id是否和當(dāng)前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("驗(yàn)證碼不正確!");
}
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"; //如果是外部提交的,這句就不會(huì)打印出來!
}
}
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í)行的匹配動(dòng)作,可以把isToken里的formName改一下,運(yùn)行,很好,沒有匹配上.證明這個(gè)成功.
是否能避免重復(fù)提交,我沒有驗(yàn)證,太簡單的邏輯了.
余下的就是判斷 來路檢查 是否正常工作了.
把上面的示例產(chǎn)生的html copy到本地的一個(gè)網(wǎng)頁內(nèi)(以達(dá)到不同的域的目的),運(yùn)行,檢查來路不明,沒有執(zhí)行動(dòng)作(需要把isToken的第三個(gè)參數(shù)設(shè)為true).
把isToken的第三個(gè)參數(shù)設(shè)置為false,提交,指定的動(dòng)作執(zhí)行了!
分享:php實(shí)現(xiàn)頁面GZIP壓縮輸出餅干是這樣壓縮的——PHP使用zlib擴(kuò)展實(shí)現(xiàn)頁面GZIP壓縮輸出 GZIP(GNU-ZIP)是一種壓縮技術(shù)。經(jīng)過GZIP壓縮后頁面大小可以變?yōu)樵瓉淼?0%甚至更
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-PHP Token(令牌)設(shè)計(jì)(3)
。