会话/Cookie问题


Session/Cookie Issue?

我在表单标记方面遇到了一些困难。我有一个全局文件,我需要在所有控制器的顶部。

/*
 *----------------------------------------------
 *  VERIFY FORM TOKENS
 *----------------------------------------------
 */    
if ($_POST) {
    // Define and Sanitize
    $formToken           = $sanitize->input($utilities->getVar('formToken', 'session'));
    $authenticityToken   = $sanitize->input($utilities->getVar('authenticityToken'));
    // Validate
    if ($authenticityToken !== $formToken) {   
        $errors[] = 'There was a token mismatch error submitting your form. Please try again.';     
    }
}  
// Generate Form Token
$formToken =  $forms->token();
$_SESSION['formToken'] = $formToken;

当宣布他们匹配后立即将vars传出时。但是当我检查数据库(我将会话保存到数据库)时,每次数据库刷新都会显示一个保存的新表单令牌。我只调用$forms->token();类一次,这就是的样子

class Forms {
    public __construct(){}
    function token() {
        $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $token      = '';
        for ($i = 0; $i < 60; $i++) {       $token .= $characters[ rand( 0, strlen( $characters ) - 1 ) ];       }
        $hash       = substr(str_shuffle($token), 0, 32);
        return $hash;
     }
}

我已经在这个问题上工作了一段时间,我很困惑为什么会发生这种情况。我还在.htaccess文件中使用mod_rewrite。我读到重写会影响会话,但所有其他会话数据都可以(会话登录数据等),正是这些令牌让我很难过。

我认为您需要在生成令牌的地方包装一个else。正如你所拥有的,看起来你得到了令牌,然后每次都创建一个新的令牌。

if ($_POST) 
{
    // Define and Sanitize
    $formToken           = $sanitize->input($utilities->getVar('formToken', 'session'));
    $authenticityToken   = $sanitize->input($utilities->getVar('authenticityToken'));
    // Validate
    if ($authenticityToken !== $formToken)
    {   
        $errors[] = 'There was a token mismatch error submitting your form. Please try again.';     
   //UPDATE: MAYBE PUT IT HERE TOO:
        $formToken =  $forms->token();
        $_SESSION['formToken'] = $formToken;
    }
}  
else
{
   //----putting in an else so this is not done again on POST--------
   // Generate Form Token
   $formToken =  $forms->token();
   $_SESSION['formToken'] = $formToken;
}