PHP Token(令牌)设计(3)_PHP教程
推荐:如何用php过滤危险html代码用PHP过滤html里可能被利用来引入外部危险内容的代码。有些时候,需要让用户提交html内容,以便丰富用户发布的信息,当然,有些可能造成显示页面布局混乱的代码也在过滤范围内。 #用户发布的html,过滤危险代码 function uh(str) { farr = array( /\s+/, //
/**
* 检查是否为指定的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");
?>
这一切看着似乎是没有问题了.
如果想判断是否是执行的匹配动作,可以把isToken里的formName改一下,运行,很好,没有匹配上.证明这个成功.
是否能避免重复提交,我没有验证,太简单的逻辑了.
余下的就是判断 来路检查 是否正常工作了.
把上面的示例产生的html copy到本地的一个网页内(以达到不同的域的目的),运行,检查来路不明,没有执行动作(需要把isToken的第三个参数设为true).
把isToken的第三个参数设置为false,提交,指定的动作执行了!
分享:php实现页面GZIP压缩输出饼干是这样压缩的——PHP使用zlib扩展实现页面GZIP压缩输出 GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更
- 相关链接:
- 教程说明:
PHP教程-PHP Token(令牌)设计(3)。