我在让安全组件验证已发布的表单时遇到问题,并且它一直在阻止该操作。查看代码我发现散列标记不匹配。
在发布的表单中,只有一个字段被验证(在 Security::_validatePost 中)被锁定。但是我在查找 Form->create 令牌的生成位置以及生成方式时遇到问题。
令牌不匹配的典型原因是什么,我应该在哪里检查 cake 是如何生成令牌的 ['_Token']['fields'] 和?(使用蛋糕 2.3.7)。该表单也使用 ajax 验证。
编辑:当我从 Security::generateToken 中转储 $token 值时,它看起来像
数组([键] => ddc88faacf41985f41359ff99d9c6f87549611c7 [allowedControllers] => 数组()
[allowedActions] => Array ( ) [unlockedFields] => Array ( ) [csrfTokens] => Array ( [f8c40609a0a86db23bfa5ea2d258723d3caff55a] => 1375207459 [084c3363363591c3024c59452899a2f4f60ecf99] => 1375207655 [0344c686c549927c1e27729ae95d879a4034bdab] => 1375207678 [dfb940ec034e82b10f7b3cc5677734da6896dfbc] => 1375207762 [ddc88faacf41985f41359ff99d9c6f87549611c7] => 1375207791 )
但是,对于创建的表单,发布表单时 Security::_validatePost 中的令牌是
令牌=6521bb362f8323e8f871814fc5d37a79c93e294e 检查=e8c40d174a23e8797d906d6e381a9a0acc1425ed
令牌取自哪里
$check = $controller->request->data;
$token = urldecode($check['_Token']['fields']);
并且检查后来被重新定义为:
$check = Security::hash(serialize($fieldList) . $unlocked . Configure::read('Security.salt'), 'sha1');
然后将 $token 和 $check 进行比较,结果为 false,从而导致黑洞。