文章浏览 复制本页面地址

PHP 防止重复提交--令牌TOKEN--SESSION--COOKIE两种方法

//配置方法
//令牌设置
'TOKEN_ON' => true, // 是否开启令牌验证 默认关闭
'TOKEN_NAME' => '__hash__', // 令牌验证的表单隐藏字段名称,默认为__hash__
'TOKEN_TYPE' => 'md5', //令牌哈希验证规则 默认为MD5
'TOKEN_RESET' => true, //令牌验证出错后是否重置令牌 默认为true

[code]
//TODO ajax无刷新多次提交暂不能满足
function autoCheckToken($data) {
// 支持使用token(false) 关闭令牌验证
if(C('TOKEN_ON')){
$name = C('TOKEN_NAME');
if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效
return false;
}
// 令牌验证
list($key,$value) = explode('_',$data[$name]);
if($value && $_SESSION[$name][$key] === $value) { // 防止重复提交
unset($_SESSION[$name][$key]); // 验证完成销毁session
return true;
}
// 开启TOKEN重置
if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]);
return false;
}
return true;
}

// 创建表单令牌
function buildToken() {
$tokenName = C('TOKEN_NAME');
$tokenType = C('TOKEN_TYPE');
if(!isset($_SESSION[$tokenName])) {
$_SESSION[$tokenName] = array();
}
// 标识当前页面唯一性
$tokenKey = md5($_SERVER['REQUEST_URI']);
if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session
$tokenValue = $_SESSION[$tokenName][$tokenKey];
}else{
$tokenValue = $tokenType(microtime(TRUE));
$_SESSION[$tokenName][$tokenKey] = $tokenValue;
}
$token = '';
return $token;
}
[/code]

//---COOKIE设置--普通类不用配置
[code]

function autoCheckToken($data) {
// 支持使用token(false) 关闭令牌验证
//if(C('TOKEN_ON')){
$name = '__hash__';
$tokenname = getCookies($name);
if(!isset($data[$name]) || !isset($tokenname)) { // 令牌数据无效
return false;
}
// 令牌验证
list($key,$value) = explode('_',$data[$name]);
$token_str = $name.$key;
$cookietoken = getCookies($token_str);
if($value && $cookietoken === $value) { // 防止重复提交
unsetCookies($token_str); // 验证完成销毁session
unset($token_str);
return true;
}
// 开启TOKEN重置
unset($cookietoken);
return false;
//}
}

// 创建表单令牌
function buildToken() {
$tokenName = '__hash__';
$tokenType = 'md5';
$token_have = getCookies($tokenName);
if(!isset($token_have)) {
setCookies($tokenName,array());
}
// 标识当前页面唯一性
$tokenKey = md5($_SERVER['REQUEST_URI']);
$cookietoken = getCookies($tokenName.$tokenKey);
if(!empty($cookietoken)) {// 相同页面不重复生成session
$tokenValue = $cookietoken;
}else{
$tokenValue = $tokenType(microtime(TRUE));
setCookies($tokenName.$tokenKey,$tokenValue);
}
$token = '';
return $token;
}

//设置cookie
/*
* @Desc 设置cookies
* @Date 2014-9-26-上午10:31:38
* @param $name cookie名
* @param $value cookie值
* @param $exprire 过期时间 默认0 不过期
* @Return return_type
*/
function setCookies($name, $value, $expire=0,$path='/',$domain='') {
$value = base64_encode($value);
return setcookie($name, $value, $expire,$path,$domain);
}

/*
* @Desc 清楚Cookie
* @Date 2014-9-26-上午10:33:11
* @param $name cookie 名称
* @Return boolen
*/
function unsetCookies($name){
setCookies($name,null,-100);
}

/*
* @Desc 获取cookie
* @Date 2014-9-26-上午10:34:03
* @param $name cookie名称
* @return value
*/
function getCookies($name){
$data = trim(@$_COOKIE[$name]);
if ($data) {
$data = base64_decode($data);
}
return $data;
}

[/code]

标签:
上一篇:
下一篇: