- 普通 - 未处理
// 自动表单令牌验证
public function autoCheckToken($data) {
$name = C('TOKEN_NAME');
$time = C('TOKEN_TIME');
$interval = C('TOKEN_INTERVAL');
if(isset($_SESSION[$name])) {
if(empty($data[$name]) || $_SESSION[$name] != $data[$name]) return false; // 非法提交
unset($_SESSION[$name]); // 验证完成销毁session
}else{
return false;
}
if(isset($_SESSION[$time])) {
if( time()- $_SESSION['token_time'] > $interval) return false; // 非法提交
unset($_SESSION[$time]);
}else{
return false;
}
return true;
}
在配置中加上'TOKEN_INTERVAL');=>120, 是等待提交秒数// 创建表单令牌隐藏域/
private function buildFormToken() {
$tokenName = C('TOKEN_NAME');
$tokenType = C('TOKEN_TYPE');
$tokenTime = C('TOKEN_TIME');
$tokenValue = $tokenType(uniqid(rand()*5, true));
$token = '';
$_SESSION[$tokenName] = $tokenValue;
$_SESSION[$tokenTime] = time();
return $token;
}
我采用的加密方式比这复杂, 在此也分享一下:
客户端从服务器端获取动态key, 在本地获取随机数,合并后在本地[color=deepskyblue]综合并重复采用[/color]MD5和其他加密方式, 再提交到服务器验证,并产生下次登录使用的动态key,以及登录后作为下次登录的动态用户密码(在客户端又做了md5和关键字的加密, 并截取再加密等). 这样, 从客户端到服务器传输的密码每次都不一样, 即使中途被拦截了传输密码, 也破解不了客户输入的真实密码. 同时, 在服务器上也设置了验证每次提交的时间间隔, 超过间隔时间, 需要重新输入密码, 而此时传输密码又不一样. 即使获取了从服务器端到客户端的动态key, 也仍然没有时间去解码并上次验证. 本地MD5加密采用js, 并且客户端必须支持js, 否则提交按钮不会显示. 当然, 客户端忘记了密码, 只有通过重置(比如系统自动产生并传输到客户提交的email地址), 服务器端储存的是动态密码, 仍然不知道表单密码框应该输入什么, 就连服务器端也解不了密. 这样,客户的密码就实现了很好的保护, 杜绝了服务器端泄漏密码的可能性. 这种方式实现的加密, 泄密的途径只有一个, 就是客户端这边.