我对表单令牌有点困难。我有一个全局文件,我需要在所有控制器的顶部。
/*
*----------------------------------------------
* 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。我读到重写会影响会话,但所有其他会话数据都没问题(会话登录数据等)只是这些令牌给我带来了困难。
答案 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;
}