会话/ Cookie问题?

时间:2014-10-30 21:43:16

标签: php .htaccess session mod-rewrite cookies

我对表单令牌有点困难。我有一个全局文件,我需要在所有控制器的顶部。

/*
 *----------------------------------------------
 *  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;

当宣布它们匹配时,立即回传出变量。但是当我检查数据库(我将会话保存到数据库)时,每个数据库刷新都会显示一个已保存的新formtoken。一旦这看起来像

,我只调用$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。我读到重写会影响会话,但所有其他会话数据都没问题(会话登录数据等)只是这些令牌给我带来了困难。

1 个答案:

答案 0 :(得分:0)

我认为您需要在生成令牌的地方包装其他内容。就像你拥有它一样,看起来你得到了令牌,然后每次都创建一个新令牌。

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;
}