我在表单标记方面遇到了一些困难。我有一个全局文件,我需要在所有控制器的顶部。
/*
*----------------------------------------------
* 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;
}