项目中需要很多的表单和后台提交,若表单提交过快,而后台使用的是事务处理,则会形成执行延迟,导致执行多遍,出现数据错乱,因此需要进行PHP表单令牌验证,于是自己写了一个类似的表单验证类。
实现原理为:在提交表单后,形成一个唯一的token值,(或者用另一种方法session),当表单提交时候,去验证session中该token是否已经存在,若是已经存在就说明该表单已经提交过了,直接返回false,若不存在则为第一次提交,继续执行后续程序
<?php
/**
* 表单令牌(防止表单恶意提交)
*/
class Form_token_Core{
const SESSION_KEY = 'SESSION_KEY';
/**
* 生成一个当前的token
* @param string $form_name
* @return string
*/
public static function grante_token($form_name)
{
$key = self::grante_key();
$_SESSION['SESSION_KEY.$form_name'] = $key;
$token = md5(substr(time(), 0, 3).$key.$form_name);
return $token;
}
/**
* 验证一个当前的token
* @param string $form_name
* @return string
*/
public static function is_token($form_name,$token)
{
$key = $_SESSION['SESSION_KEY.$form_name'];
$old_token = md5(substr(time(), 0, 3).$key.$form_name);
if($old_token == $token)
{
return true;
} else {
return false;
}
}
/**
* 删除一个token
* @param string $form_name
* @return boolean
*/
public static function drop_token($form_name)
{
$session->delete(SESSION_KEY);
return true;
}
/**
* 生成一个密钥
* @return string
*/
public static function grante_key()
{
$encrypt_key = md5(((float) date("YmdHis") + rand(100,999)).rand(1000,9999));
return $encrypt_key;
}
}
?>