zf2 csrf 不工作
zf2 csrf not working
我们可以轻松破解ZF2的CSRF。如果我们删除连字符 (-
) 之后的字符串,CsrfValidator
不会给出任何错误并且令牌已成功提交。
例如CSRF token = 245454547kck-kjhjh2454dh
编辑token后token = 245454547kck-
ZF2成功提交表单,但肯定报错
任何人都可以检查这个并让我知道是否有解决此问题的方法。
对于上述场景,我们使用:
$csrfValidator = new CsrfValidator(array(
'name'=> 'token_name',//(here i used 'csrf' also)
'salt'=> 'test_salt',
));
$csrf = new CsrfElement('token_name');
$csrf->setCsrfValidator($csrfValidator);
$this->add($csrf);
$this->csrf = $csrf;
验证者:
$inputFilter->add(
$factory->createInput(array(
'name' => 'token_name',
'required' => true,
'validators' => array(
$this->csrf->getCsrfValidator()
)
))
);
请提供解决方案。
据我从代码中可以看出,这是为了保持向后兼容性的预期行为。
字符串的第二部分是令牌 ID(不是实际的 anti-CSRF 令牌),用于跟踪同一会话中的多个 anti-CSRF 令牌。如果在验证期间未设置 ID(如您的示例),则代码仅检查会话存储中的哈希值。源代码表明这是为了避免 BC 中断 (see source code)
如果你真的想强制执行令牌 ID,你可以扩展 Zend\Validator\Csrf
并覆盖 getValidationToken()
(即删除 BC 代码):
class MyCustomCsrf extends \Zend\Validator\Csrf
{
/**
* Get validation token
*
* Retrieve token from session, if it exists.
*
* @override
* @param string $tokenId
* @return null|string
*/
protected function getValidationToken($tokenId = null)
{
$session = $this->getSession();
if ($tokenId && isset($session->tokenList[$tokenId])) {
return $this->formatHash($session->tokenList[$tokenId], $tokenId);
}
return;
}
}
我们可以轻松破解ZF2的CSRF。如果我们删除连字符 (-
) 之后的字符串,CsrfValidator
不会给出任何错误并且令牌已成功提交。
例如CSRF token = 245454547kck-kjhjh2454dh
编辑token后token = 245454547kck-
ZF2成功提交表单,但肯定报错
任何人都可以检查这个并让我知道是否有解决此问题的方法。
对于上述场景,我们使用:
$csrfValidator = new CsrfValidator(array(
'name'=> 'token_name',//(here i used 'csrf' also)
'salt'=> 'test_salt',
));
$csrf = new CsrfElement('token_name');
$csrf->setCsrfValidator($csrfValidator);
$this->add($csrf);
$this->csrf = $csrf;
验证者:
$inputFilter->add(
$factory->createInput(array(
'name' => 'token_name',
'required' => true,
'validators' => array(
$this->csrf->getCsrfValidator()
)
))
);
请提供解决方案。
据我从代码中可以看出,这是为了保持向后兼容性的预期行为。
字符串的第二部分是令牌 ID(不是实际的 anti-CSRF 令牌),用于跟踪同一会话中的多个 anti-CSRF 令牌。如果在验证期间未设置 ID(如您的示例),则代码仅检查会话存储中的哈希值。源代码表明这是为了避免 BC 中断 (see source code)
如果你真的想强制执行令牌 ID,你可以扩展 Zend\Validator\Csrf
并覆盖 getValidationToken()
(即删除 BC 代码):
class MyCustomCsrf extends \Zend\Validator\Csrf
{
/**
* Get validation token
*
* Retrieve token from session, if it exists.
*
* @override
* @param string $tokenId
* @return null|string
*/
protected function getValidationToken($tokenId = null)
{
$session = $this->getSession();
if ($tokenId && isset($session->tokenList[$tokenId])) {
return $this->formatHash($session->tokenList[$tokenId], $tokenId);
}
return;
}
}