Wordpress搞砸PHP会话和表单验证令牌不匹配

时间:2014-06-03 16:36:06

标签: php session

由于某种原因,当它生成令牌时,它会在会话中存储另一个令牌,并且它是一个完全随机的令牌。

这是令牌类的代码 -

class Token {

protected static $token;

public static function generate() {
    if(!self::$token){
    self::$token = md5(uniqid());
    }
    return Session::put(Config::get('session/token_name'), self::$token);
}


public static function check($token) {
    $tokenName = Config::get('session/token_name');

    if(Session::exists($tokenName) && $token === Session::get($tokenName)) {
        Session::delete($tokenName);
        return true;
    }

    return false;
}
} 

这是我的Session类的代码 -

class Session {
public static function exists($name) {
    return (isset($_SESSION[$name])) ? true : false;
}

public static function get($name) {
    return $_SESSION[$name];
}

public static function put($name, $value) {
    return $_SESSION[$name] = $value;
}

public static function delete($name) {
    if(self::exists($name)) {
        unset($_SESSION[$name]);
    }
}

public static function flash($name, $string = null) {
    if(self::exists($name)) {
        $session = self::get($name);
        self::delete($name);
        return $session;
    } else if ($string) {
        self::put($name, $string);
    }
}
}

Config::get('session/token_name')只返回'token'

否则我在哪里生成一个新令牌,无论如何它都无关紧要,因为它会因为静态变量而返回一个令牌。

为什么WordPress这样做?

请帮助我一直试图让它连续工作超过10个小时!

1 个答案:

答案 0 :(得分:1)

对于生成函数 -

public static function generate() {
    if(!Session::get(Config::get('session/token_name'))){
    return Session::put(Config::get('session/token_name'), md5(mt_rand())); 
    }
    else{
    return Session::put(Config::get('session/token_name'), Session::get(Config::get('session/token_name')));
    }
}

这可确保您只为每个会话创建一个。